当前位置: 首页 > 知识库问答 >
问题:

使用JMS生产者发送的消息在同一个SpringBoot应用程序中的MQTT接收器中没有收到

淳于坚壁
2023-03-14

我刚开始使用ActiveMQ Artemis,并在我的机器上安装了Artemis2.17.0。创建了SpringBoot测试应用程序,其中存在JMS和MQTT发布者和接收者。还创建了小的RestController,这样我就可以使用JMS和MQTT生成器发送消息。接收器非常简单,只需创建一条日志消息到控制台。现在,当我使用MQTT生产者创建消息时,JMS和MQTT接收器都将消息获取并记录到控制台。但是当我使用JMS producer发送消息时,消息只在JMS receiver中接收,而在控制台中没有MQTT消息。试了好几次。实现是ok的,我认为作为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个答案

龙焱
2023-03-14

Apache ActiveMQ Artemis具有灵活的寻址模型,支持点对点和发布订阅模式。默认情况下,Spring Boot创建一个配置为点对点传输的JmsTemplate,而MQTT使用发布-订阅模式,因此JMS和MQTT接收器使用不同的消息传递模式,这就造成了问题。

要通过引导的application.properties为发布-订阅模式设置spring.jms.pub-sub-domain=true配置JmsTemplate,或者将JmsTemplatepubsubdomain设置为true,即:

jmsTemplate.setPubSubDomain(true);

要配置发布-订阅模式的JmsListener,通过引导的application.properties设置spring.jms.pub-sub-domain=true或将JmsListenerContainerFactorypubsubdomain设置为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) {
    ...
}
 类似资料:
  • 我使用的是Spring Cloud Stream和RabbitMQ,我在同一个应用程序中配置了生产者和消费者,但使用了两个不同的通道。问题是,我的应用程序有五个副本在Kubernetes上运行,但只有发送消息的pod会使用它们,其他四个不会使用。在RabbitMQ控制台上,没有收到任何消息,消息速率图不会更改。当我注释OrdersListener时,消息会成功发送到RabbitMQ集群。有人知道可

  • 我正在使用JMS模板和Spring Boot同步发送/接收JMS队列调用。我查看了JMS模板的正式spring文档,但没有任何帮助。 我不太确定具体调用receive()方法,否则一旦调用send(),它就会自动接收消息。因为这是同步调用,所以我只需要接收我发送的消息(带有相关Id)。 下面是我的spring boot代码。 JMSSConfig.java 发送方和接收方代码

  • 若JMS接收器由于数据库连接失败等原因而失败,那个么JMS消息将丢失。有人能告诉我什么是使用spring boot应用程序避免丢失JMS消息的常见解决方案吗 在接收端处理消息时,如果出现错误,我是否应该将消息重新发送回它发源的队列? 这是我的场景源代码。 制作人 消费者

  • 我有一个JMS生产者和一个消费者,代理是ActiveMQ,参考下面的代码: 寄件人代码 接收码 问题是 ActiveMQ 队列无法接收来自发送方的消息(请参阅屏幕截图): 当我从 Web 控制台发送消息时,该消息在队列中收到,但来自创建者的消息不会进入队列。 另一个有趣的行为是(如队列接收器代码中所示,接收器在收到第一条消息后退出),同样,当我启动接收器时,它会收到相同的消息,并继续执行,直到我关

  • 我有一个关于RabbitMQ队列的问题。我想在一个队列上发送两种类型的消息。 我知道,我可以创建两个不同的队列,并使用路由键将不同的消息发送到不同的队列。 但是我希望在一个队列上有两个消费者,并以某种方式将消费者与消息类型绑定。它是通过兔子队列驱动的事件,当客户端和核心是发布者和消费者时。 有可能吗?或者我应该使用不同的队列吗? 数据交换

  • mosquitto.conf将最大飞行消息设置为0,持久性为true。 发布服务器QOS=2 用户QOS=2 保持活力=60 还有其他参数我应该看吗?