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



我已经使用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); 
}

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

但当它们连接时,就会创建任意播队列。所以我试着把地址添加到我的经纪人中,就像这样:

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

这似乎没有任何作用。将创建任意播队列。

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

我不确定所有这些数据最终将如何使用,所以我正在努力提供尽可能灵活的数据。我知道它的大部分根本不会被使用,至少在一段时间内不会。

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

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

阿尔忒弥斯2.17Spring Boot 2.5

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

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

这意味着您希望使用JMS主题

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

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

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

最新更新