JMS с весенней загрузкой, отправителем и получателем в одном пакете: для чего он нужен?

Я изучаю JMS с весенней загрузкой, и приятно знать, что весенняя загрузка идет со встроенным брокером Active MQ JMS.

Я начал с весенняя страница о том, как этого добиться, и это работает как шарм. Теперь я пошел немного дальше и создал два отдельных приложения для весенней загрузки, одно из которых содержит код отправителя jms, а другое - код получателя.

Я попытался запустить приложение, но приложение не удалось, поскольку оба приложения используют один и тот же порт для JMS. Я исправил это, включив это в одно приложение

@Bean
      public BrokerService broker() throws Exception {
          final BrokerService broker = new BrokerService();
          broker.addConnector("tcp://localhost:61616");
          broker.addConnector("vm://localhost");
          broker.setPersistent(false);
          return broker;
      }

Но теперь отправитель успешно отправляет сообщение, но получатель ничего не делает. Я ищу в stackoverflow и смотрю это и это. И они говорят:

If you want to use JMS in production, it would be much wiser to avoid using Spring Boot embedded JMS brokers and host it separately. So 3 node setup would be preferred for PROD.

Итак, мои вопросы: 1. Какова цель размещения отправителя и получателя jms в одном приложении? Есть какой-нибудь практический пример 2. Действительно ли невозможно использовать встроенную JMS с весенней загрузкой для связи двух отдельных приложений.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
645
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас могут быть отправитель и получатель в одном приложении, если запросы поступают пачками, и вы хотите их где-то сохранить до обработки, в случае сбоя сервера. Обычно для этого вы бы не использовали встроенный брокер.

Встроенные брокеры обычно используются только для тестирования.

Однако вы можете запустить встроенный брокер, доступный извне; просто запустите BrokerService, как и у вас, но другое приложение должно подключаться к адресу tcp://..., а не к vm://....

РЕДАКТИРОВАТЬ

Приложение1:

@SpringBootApplication
@RestController
public class So52654109Application {

    public static void main(String[] args) {
        SpringApplication.run(So52654109Application.class, args);
    }

    @Bean
    public BrokerService broker() throws Exception {
        final BrokerService broker = new BrokerService();
        broker.addConnector("tcp://localhost:61616");
        broker.setPersistent(false);
        broker.start();
        return broker;
    }

    @Autowired
    private JmsTemplate template;

    @RequestMapping(path = "/foo/{id}")
    public String foo(@PathVariable String id) {
        template.convertAndSend("someQueue", id);
        return id + ": thank you for your request, we'll send an email to the address on file when complete";
    }

}

Приложение 2:

application.properties

spring.activemq.broker-url=tcp://localhost:61616

а также

@SpringBootApplication
public class So526541091Application {

    public static void main(String[] args) {
        SpringApplication.run(So526541091Application.class, args);
    }

    @JmsListener(destination = "someQueue")
    public void process(String id) {
        System.out.println("Processing request for id");
    }

}

Ясно, что для такого простого приложения вы можете просто запустить прослушиватель в первом приложении.

Однако, поскольку в этой конфигурации сообщения не сохраняются, вы, скорее всего, будете использовать внешний брокер для производственного приложения (или включить сохранение).

Извините, но я не понял вашего ответа. Не могли бы вы уточнить.

user9735824 04.10.2018 22:47

Какую часть вы не понимаете?

Gary Russell 04.10.2018 22:48

первая часть и третья часть. Второй абзац не требует пояснений.

user9735824 04.10.2018 22:49

Спасибо. Но мой получатель по-прежнему не может получить сообщение. Я следил за тем, что вы объяснили, я получаю сообщение об ошибке: [ERROR] ~ 2018-10-04-16.31.14.313CDT ~~~~~ osjlDefaultMessageListenerContainer Не удалось обновить соединение JMS для пункта назначения 'OrderTransactionQueue' - повторная попытка с использованием FixedBackOff {interval = 5000, currentAttempts = 15, maxAttempts = unlimited}. Причина: не удалось подключиться к брокеру URL: tcp: // localhost: 61616. Причина: java.net.ConnectException: соединение отклонено: соединение

user9735824 04.10.2018 23:32

Вы start() брокера (это отсутствует в вашем исходном вопросе - см. Мой ответ)?

Gary Russell 04.10.2018 23:34

Я сделал это сейчас, и я получаю другую ошибку. Я отправляю объект модели, и они находятся под другим именем пакета в двух разных приложениях, и теперь я получаю исключение class not found.

user9735824 04.10.2018 23:41

Тогда вы не сможете использовать сериализацию Java, переключитесь на что-то вроде JSON. spring-jms предоставляет MappingJackson2MessageConverter, который можно настроить для сопоставления исходного типа с целевым типом. См. Его javadocs; если вы не можете понять, как его использовать, вам следует задать новый вопрос. Админы здесь не любят расширенных обсуждений в комментариях,

Gary Russell 04.10.2018 23:49

Другие вопросы по теме