我使用 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
问题。
鉴于您希望客户端能够连接并且:
这意味着您想要使用 JMS topic。
但是,您的
@JmsListener
定义正在使用 JMS queue,因为这是它们默认使用的。请查看这个答案,了解有关如何让他们使用 JMS 主题的详细信息。
由于您的
@JmsListener
定义使用 JMS 队列,代理会自动创建并自动使用 anycast 资源。这就是为什么无论您在代理上更改什么配置,您都会看到相同的行为。
最终您不需要在
address
中定义任何 queue
或 broker.xml
。只要客户端使用正确类型的 JMS 资源,所有代理端资源都会自动创建。另外,您的 @JmsListener
定义应仅使用地址名称,而不是 FQQN。