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

问题描述 投票:0回答:1

我使用 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 spring-jms activemq-artemis
1个回答
2
投票

鉴于您希望客户端能够连接并且:

  • 为他们需要的数据指定一个选择器
  • 仅接收新传入消息

这意味着您想要使用 JMS topic

但是,您的

@JmsListener
定义正在使用 JMS queue,因为这是它们默认使用的。请查看这个答案,了解有关如何让他们使用 JMS 主题的详细信息。

由于您的

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

最终您不需要在

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

© www.soinside.com 2019 - 2024. All rights reserved.