Spring boot 在同一SpringBoot应用程序中的MQTT接收器中未接收到使用JMS producer发送的消息

Spring boot 在同一SpringBoot应用程序中的MQTT接收器中未接收到使用JMS producer发送的消息,spring-boot,activemq-artemis,Spring Boot,Activemq Artemis,我刚刚开始使用ActiveMQ Artemis,并在我的机器上安装了Artemis 2.17.0。创建了SpringBoot测试应用程序,其中存在JMS和MQTT发布者和接收者。还创建了小型RestController,这样我就可以使用JMS和MQTT生产者发送消息。接收器非常简单,只需创建一条日志消息到控制台。现在,当我使用MQTT生产者创建消息时,JMS和MQTT接收器都会将消息获取并记录到控制台。但当我使用JMS生产者发送消息时,消息只在JMS接收器中接收,而在控制台中没有MQTT消息。试

我刚刚开始使用ActiveMQ Artemis,并在我的机器上安装了Artemis 2.17.0。创建了SpringBoot测试应用程序,其中存在JMS和MQTT发布者和接收者。还创建了小型RestController,这样我就可以使用JMS和MQTT生产者发送消息。接收器非常简单,只需创建一条日志消息到控制台。现在,当我使用MQTT生产者创建消息时,JMS和MQTT接收器都会将消息获取并记录到控制台。但当我使用JMS生产者发送消息时,消息只在JMS接收器中接收,而在控制台中没有MQTT消息。试了好几次。实现还可以,我认为MQTT生产者示例运行良好。以这种方式在Artemis协议之间路由消息是否有任何限制?或者是什么样的问题

  • 有关JMS实现的代码信息:
  • 有关MQTT实现的代码信息:

ApacheActiveMQ Artemis有一个灵活的接口,支持点对点和发布-订阅模式。 默认情况下,Spring Boot创建一个配置为点对点传输的JmsTemplate,而MQTT使用发布-订阅模式,因此JMS和MQTT接收器使用不同的消息传递模式,这会导致您的问题

要通过启动的
应用程序.properties
为发布订阅模式集
spring.jms.pub sub-domain=true
配置JmsTemplate,或将JmsTemplate
pubSubDomain
设置为
true
,即:

jmsTemplate.setPubSubDomain(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) {
    ...
}
要通过启动的
应用程序.properties
为发布订阅模式集
spring.jms.pub sub-domain=true
配置JmsListener,或将JmsListenerContainerFactory
pubSubDomain
设置为
true
,即:

jmsTemplate.setPubSubDomain(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) {
    ...
}
@Bean
公共JmsListenerContainerFactory主题连接工厂(连接工厂连接工厂,默认JMSListenerContainerFactoryConfigurer配置器){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
configurer.configure(工厂、连接工厂);
factory.setPubSubDomain(true);
返回工厂;
}
@JmsListener(destination=“${prices.mqtt.east}”,containerFactory=“topicConnectionFactory”)
public void receiveFromTopic(字符串消息){
...
}

谢谢,是的,这很有效。至少部分。我设置了变量application.properties,现在MQQT正在接收JMS生成的mesage,但JMS侦听器不知道该做什么,JMS侦听器有以下注释:@JmsListener(destination=“${prices.mqtt.east}”)@DavidMarko我已经更新了我的答案,以修复Boot'a应用程序属性
spring.jms.pub sub-domain
的名称,并且我添加了一个示例,如果应用程序属性不适用于您,则使用自定义JmsListenerContainerFactory创建JmsListener。此更新的spring.jms.pub sub-domain=true完成了正确的工作。现在,JMS和MQTT侦听器都获得了消息。非常感谢你的洞察力。