#spring-boot #activemq-artemis
Вопрос:
Я только начинаю с ActiveMQ Artemis, и на моей машине установлена Artemis 2.17.0. Создал тестовое приложение SpringBoot, в котором существуют как издатели, так и получатели JMS и MQTT. Создал также небольшой рестконтроллер, чтобы я мог отправлять сообщения как с помощью JMS, так и с помощью производителей MQTT. Приемники довольно просты и просто создают сообщение журнала для консоли. Теперь, когда я создаю сообщение с помощью производителя MQTT, приемники JMS и MQTT получают и регистрируют сообщение в консоли. Но когда я отправляю сообщение с помощью производителя JMS, сообщение принимается только в приемнике JMS, без сообщения MQTT в консоли. Пробовал несколько раз. Реализация в порядке, я думаю, что пример производителя MQTT работает нормально. Существуют ли какие-либо ограничения для маршрутизации сообщений между протоколами в Artemis таким образом? Или что это может быть за проблема?
- Информация о коде реализации JMS: https://dmarko.tcl-digitrade.com/post/2021/activemq-artemis-spring-boot/
- Информация о коде реализации MQTT: https://dmarko.tcl-digitrade.com/post/2021/activemq-artemis-mqtt/
Ответ №1:
Apache ActiveMQ Artemis имеет гибкую модель адресации, которая поддерживает шаблоны «Точка-точка» и «Публикация-подписка». По умолчанию Spring Boot создает шаблон JmsTemplate, настроенный для передачи от точки к точке, в то время как MQTT использует шаблон публикации и подписки, поэтому приемники JMS и MQTT используют разные шаблоны обмена сообщениями, и это вызывает проблему.
Чтобы настроить шаблон JmsTemplate для шаблона публикации-подписки , заданного spring.jms.pub-sub-domain=true
с помощью загрузки application.properties
, или установите pubSubDomain
для true
него значение JmsTemplate, т. Е.:
jmsTemplate.setPubSubDomain(true);
Чтобы настроить JmsListener для шаблона публикации-подписки , установленного spring.jms.pub-sub-domain=true
через Boot application.properties
, или установить JmsListenerContainerFactory pubSubDomain
в true
, т. е.:
@Bean
public JmsListenerContainerFactory<?> topicConnectionFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
@JmsListener(destination = "${prices.mqtt.east}", containerFactory = "topicConnectionFactory")
public void receiveFromTopic(String message) {
...
}
Комментарии:
1. Спасибо, да, это работает. По крайней мере, частично. Я установил переменную application.properties, и теперь MQQT получает сообщение, созданное JMS, но прослушиватель JMS этого не делает 🙂 Любая идея, что делать, у слушателя JMS есть следующая аннотация: @JmsListener(назначение = «${prices.mqtt.east}»)
2. @DavidMarko Я обновил свой ответ, чтобы исправить имя свойства приложения Boot’
spring.jms.pub-sub-domain
a, и я добавил пример с JmsListener, используя пользовательский JmsListenerContainerFactory, если свойство приложения не работает для вас.3. Этот обновленный spring.jms.pub-поддомен=true выполнил правильную работу. Теперь и слушатели JMS, и слушатели MQTT получают сообщение. Большое спасибо за понимание.