jms - 设置ActiveMQ Artemis路由类型,Spring Boot JmsListener作为客户端

标签 jms spring-jms activemq-artemis

我使用 ActiveMQ Artemis 已有一年多了。到目前为止,我的要求是保留顺序、电子邮件、供应商更新等消息。因此,我明确创建了一个地址,并在其下为每个消费者创建了一个队列。这样,即使生产者和消费者都关闭,我也不会丢失待处理的订单。

我的新案例基本上相反。我有大量来自网络套接字的数据。我需要过滤它并在 ActiveMQ Artemis 上提供它。优选地,客户端可以订阅该地址并基于它们提供的消息选择器接收消息。例如,以下是我正在尝试使用 Spring Boot 的两个客户端:

@JmsListener(destination="price.address::price.2.queue", selector="JMSType='test'")
public void testReceiver1(String msg) {
    System.out.println("1 " + msg); 
}
@JmsListener(destination="price.address::price.2.queue")
public void testReceiver2(String msg) {
    System.out.println("2 " + msg); 
}

理想情况下,这两个客户端/监听器应该能够订阅选播,因此其中一个或两个都可以指定选择器并获取这些消息。

但是当它们连接时,就会创建任播队列。所以我尝试将地址添加到我的经纪人中,如下所示:

<addresses>
   <address name="price.address">
      <multicast/>
   </address>
</addresses>

这似乎没有做任何事情。任播队列已创建。

我还尝试将两个监听器设置为直接指向主题/地址(不使用 FQQN),但仍然出现任播路由类型 - 名为 price.address 的单个队列。

我不确定所有这些数据最终将如何使用,所以我试图尽可能灵活地提供。我知道其中大部分根本不会被使用,至少暂时不会。

我有另一个项目,其中大部分传入数据都没有使用。我为此设置了一个地址和带有过滤器的显式队列,每个客户端都需要过滤数据。这很好用,但现在的区别是,我需要客户端能够连接并为他们需要的数据指定过滤器(选择器),并且只接收新的传入消息。

我不确定这是 JMS 客户端的 ActiveMQ Artemis 问题还是 Spring Boot @JmsListener 问题。

  • ActiveMQ Artemis 2.17
  • Spring Boot 2.5

最佳答案

假设您希望客户端能够连接并且:

  • 为所需数据指定选择器
  • 仅接收新传入消息

这意味着您想要使用 JMS 主题

但是,您的 @JmsListener 定义正在使用 JMS 队列,因为这是它们默认使用的。看看this answer了解如何让他们使用 JMS 主题的详细信息。

由于您的 @JmsListener 定义使用 JMS 队列,因此代理会自动创建并自动使用 anycast 资源。这就是为什么无论您在代理上更改什么配置,您都会看到相同的行为。

最终您不需要在 broker.xml 中定义任何地址队列。只要客户端使用正确类型的 JMS 资源,所有代理端资源都会自动创建。另外,您的 @JmsListener 定义应该只使用地址名称,而不是 FQQN。

关于jms - 设置ActiveMQ Artemis路由类型,Spring Boot JmsListener作为客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67710659/

相关文章:

Java EE/Glassfish 应用程序逻辑

filter - JMS 选择器与单独队列

java - 多个 DefaultMessageListenerContainer 提供单个 TaskExecutor/ThreadPool(公平地)

java - Spring Jms 每秒发出警告消息

java - 如何使用 Apache Camel/Spring-boot 订阅持久主题?

java - 警告 : JAVA_HOME environment variable is not set

java - 消费者从 Apache ActiveMQ Artemis 中的接收方法接收单个消息

java - 寻址未知服务器 ActiveMQ 时连接停止

java - Activemq 嵌入式代理;在生产中实用可靠?

java - 是否有兼容 Java 1.7 的 Artemis JMS 客户端?