将ActiveMQ Artemis路由类型、Spring Boot JmsListener设置为客户端
我已经使用ActiveMQ Artemis一年多了。到目前为止,我的要求是保留消息。比如订单、电子邮件、供应商更新。。。因此,我已经明确地创建了一个地址,并在其下为每个消费者创建了一个队列。这样,即使生产商和消费者都关闭了,我也不会失去待定订单 我的新案例基本上是相反的。我有来自web套接字的大量数据。我需要过滤这个,并在Artemis上提供它。优选地,客户端可以订阅地址并基于其提供的消息选择器接收消息。例如,这里有两个我正在使用Spring Boot进行试验的客户端将ActiveMQ Artemis路由类型、Spring Boot JmsListener设置为客户端,jms,spring-jms,activemq-artemis,Jms,Spring Jms,Activemq Artemis,我已经使用ActiveMQ Artemis一年多了。到目前为止,我的要求是保留消息。比如订单、电子邮件、供应商更新。。。因此,我已经明确地创建了一个地址,并在其下为每个消费者创建了一个队列。这样,即使生产商和消费者都关闭了,我也不会失去待定订单 我的新案例基本上是相反的。我有来自web套接字的大量数据。我需要过滤这个,并在Artemis上提供它。优选地,客户端可以订阅地址并基于其提供的消息选择器接收消息。例如,这里有两个我正在使用Spring Boot进行试验的客户端 @JmsListener(
@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.17
Spring Boot 2.5假设您希望客户端能够连接并:
- 为所需的数据指定选择器
- 只接收新的传入消息
@JmsListener
定义使用的是JMS队列,因为默认情况下它们使用的是JMS队列。请参阅,了解有关如何使他们使用JMS主题的详细信息
由于您的@JmsListener
定义使用的是JMS队列,因此代理将自动创建并使用选播资源。这就是为什么无论在代理上更改什么配置,您都会看到相同的行为
最终,您不需要在broker.xml
中定义任何地址
或队列
。只要客户机使用正确类型的JMS资源,所有代理端资源都将自动创建。另外,您的@JmsListener
定义应该只使用地址名,而不是FQQN