Сообщение, отправленное с помощью производителя JMS, не получено в приемнике MQTT в том же приложении SpringBoot

#spring-boot #activemq-artemis

Вопрос:

Я только начинаю с ActiveMQ Artemis, и на моей машине установлена Artemis 2.17.0. Создал тестовое приложение SpringBoot, в котором существуют как издатели, так и получатели JMS и MQTT. Создал также небольшой рестконтроллер, чтобы я мог отправлять сообщения как с помощью JMS, так и с помощью производителей MQTT. Приемники довольно просты и просто создают сообщение журнала для консоли. Теперь, когда я создаю сообщение с помощью производителя MQTT, приемники JMS и MQTT получают и регистрируют сообщение в консоли. Но когда я отправляю сообщение с помощью производителя JMS, сообщение принимается только в приемнике JMS, без сообщения MQTT в консоли. Пробовал несколько раз. Реализация в порядке, я думаю, что пример производителя MQTT работает нормально. Существуют ли какие-либо ограничения для маршрутизации сообщений между протоколами в Artemis таким образом? Или что это может быть за проблема?

Ответ №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 получают сообщение. Большое спасибо за понимание.