Я изучаю 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 с весенней загрузкой для связи двух отдельных приложений.




У вас могут быть отправитель и получатель в одном приложении, если запросы поступают пачками, и вы хотите их где-то сохранить до обработки, в случае сбоя сервера. Обычно для этого вы бы не использовали встроенный брокер.
Встроенные брокеры обычно используются только для тестирования.
Однако вы можете запустить встроенный брокер, доступный извне; просто запустите 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");
}
}
Ясно, что для такого простого приложения вы можете просто запустить прослушиватель в первом приложении.
Однако, поскольку в этой конфигурации сообщения не сохраняются, вы, скорее всего, будете использовать внешний брокер для производственного приложения (или включить сохранение).
Какую часть вы не понимаете?
первая часть и третья часть. Второй абзац не требует пояснений.
Спасибо. Но мой получатель по-прежнему не может получить сообщение. Я следил за тем, что вы объяснили, я получаю сообщение об ошибке: [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: соединение отклонено: соединение
Вы start() брокера (это отсутствует в вашем исходном вопросе - см. Мой ответ)?
Я сделал это сейчас, и я получаю другую ошибку. Я отправляю объект модели, и они находятся под другим именем пакета в двух разных приложениях, и теперь я получаю исключение class not found.
Тогда вы не сможете использовать сериализацию Java, переключитесь на что-то вроде JSON. spring-jms предоставляет MappingJackson2MessageConverter, который можно настроить для сопоставления исходного типа с целевым типом. См. Его javadocs; если вы не можете понять, как его использовать, вам следует задать новый вопрос. Админы здесь не любят расширенных обсуждений в комментариях,
Извините, но я не понял вашего ответа. Не могли бы вы уточнить.