设置 ActiveMQ Artemis 路由类型,Spring 将 JmsListener 作为客户端启动
Setting ActiveMQ Artemis routing type, Spring Boot JmsListener as client
我使用 ActiveMQ Artemis 已经一年多了。到目前为止,我的要求是保留消息。像订单、电子邮件、供应商更新……所以我一直在明确地创建一个地址,并在它下面为每个消费者创建一个队列。这样,即使生产者和消费者都关闭了,我也不会丢失挂单,例如。
我的新案例基本上是相反的。我有大量来自网络套接字的数据。我需要过滤它并在 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);
}
理想情况下,这两个 clients/listeners 应该能够订阅任播,这样一个或两个都可以指定一个选择器并获取这些消息。
但是当它们连接时,会创建任播队列。所以我尝试像这样将地址添加到我的经纪人:
<addresses>
<address name="price.address">
<multicast/>
</address>
</addresses>
这似乎没有做任何事情。任播队列已创建。
我还尝试将两个侦听器设置为直接指向 topic/address(不使用 FQQN),但仍然出现任播路由类型——一个名为“price.address”的队列。
我不确定所有这些数据最终将如何使用,所以我会尽可能灵活地提供。我知道其中大部分根本不会被使用,至少暂时不会。
我有另一个项目,其中大部分传入数据未被使用。我为此设置了一个地址和带有过滤器的显式队列,一个用于每个需要过滤数据的客户端。这很好用,但现在的区别是我需要客户端能够连接并为他们需要的数据指定过滤器(选择器),并且只接收新传入的消息。
我不确定这是 JMS 客户端的 Artemis 问题还是 Sprint Boot @JmsListener 问题。
阿尔忒弥斯 2.17
Spring 启动 2.5
鉴于您希望客户端能够连接并且:
- 为他们需要的数据指定一个选择器
- 只接收新的传入消息
这意味着您要使用 JMS topic。
但是,您的 @JmsListener
定义使用的是 JMS queue,因为这是它们默认使用的。查看 了解有关如何使它们使用 JMS 主题的详细信息。
由于您的 @JmsListener
定义正在使用 JMS 队列,代理会自动创建并自动使用 anycast 资源。这就是为什么无论您在代理上更改什么配置,您都会看到相同的行为。
最终您不需要在 broker.xml
中定义任何 address
或 queue
。只要客户端使用正确类型的 JMS 资源,所有代理端资源都会自动创建。此外,您的 @JmsListener
定义应该只使用地址名称而不是 FQQN。
我使用 ActiveMQ Artemis 已经一年多了。到目前为止,我的要求是保留消息。像订单、电子邮件、供应商更新……所以我一直在明确地创建一个地址,并在它下面为每个消费者创建一个队列。这样,即使生产者和消费者都关闭了,我也不会丢失挂单,例如。
我的新案例基本上是相反的。我有大量来自网络套接字的数据。我需要过滤它并在 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);
}
理想情况下,这两个 clients/listeners 应该能够订阅任播,这样一个或两个都可以指定一个选择器并获取这些消息。
但是当它们连接时,会创建任播队列。所以我尝试像这样将地址添加到我的经纪人:
<addresses>
<address name="price.address">
<multicast/>
</address>
</addresses>
这似乎没有做任何事情。任播队列已创建。
我还尝试将两个侦听器设置为直接指向 topic/address(不使用 FQQN),但仍然出现任播路由类型——一个名为“price.address”的队列。
我不确定所有这些数据最终将如何使用,所以我会尽可能灵活地提供。我知道其中大部分根本不会被使用,至少暂时不会。
我有另一个项目,其中大部分传入数据未被使用。我为此设置了一个地址和带有过滤器的显式队列,一个用于每个需要过滤数据的客户端。这很好用,但现在的区别是我需要客户端能够连接并为他们需要的数据指定过滤器(选择器),并且只接收新传入的消息。
我不确定这是 JMS 客户端的 Artemis 问题还是 Sprint Boot @JmsListener 问题。
阿尔忒弥斯 2.17 Spring 启动 2.5
鉴于您希望客户端能够连接并且:
- 为他们需要的数据指定一个选择器
- 只接收新的传入消息
这意味着您要使用 JMS topic。
但是,您的 @JmsListener
定义使用的是 JMS queue,因为这是它们默认使用的。查看
由于您的 @JmsListener
定义正在使用 JMS 队列,代理会自动创建并自动使用 anycast 资源。这就是为什么无论您在代理上更改什么配置,您都会看到相同的行为。
最终您不需要在 broker.xml
中定义任何 address
或 queue
。只要客户端使用正确类型的 JMS 资源,所有代理端资源都会自动创建。此外,您的 @JmsListener
定义应该只使用地址名称而不是 FQQN。