Spring-integration / ActiveMQ 在单个线程中订阅多个目的地

Posted

技术标签:

【中文标题】Spring-integration / ActiveMQ 在单个线程中订阅多个目的地【英文标题】:Spring-integration / ActiveMQ subscribe to multiple destinations in a single thread 【发布时间】:2015-08-02 15:48:59 【问题描述】:

我正在使用多个<si:service-activator><jms:message-driven-channel-adapter> 订阅多个队列和主题。来自每个目的地的消息都在一个单独的线程中接收,这意味着我的接收代码充满了锁来保护可变的内部状态。

我希望我的接收代码是无锁的。是否可以将 spring-integration/activemq 配置为从同一线程上的多个目的地接收?

如果这不可能,我可以想到两种选择:

    启动我自己的处理线程,该线程从阻塞队列中读取数据,将所有接收到的消息放到这个队列中。

    将所有收到的消息分派到一个目的地并从中消费。

谁有更好的想法?

【问题讨论】:

【参考方案1】:

在单个队列上使用wildcard pattern。

也就是说,不是从两个队列中读取,而是使用一个队列并在名称中指定要读取的所有队列。

即:"QUEUE.NR1,QUEUE.NR2""SOME.PREFIX.>" 以读取具有该前缀的所有队列。您的客户端代码将此作为单个队列处理。

【讨论】:

是的,这确实有效。注意:通过通配符订阅的队列(即使是 2 个逗号分隔)在收到第一条消息之前不会显示在 Web 控制台中。下一个问题是如何用通配符混合队列和主题? 使用 VirtualTopics 使用队列订阅主题。否则你不能真正混合。 activemq.apache.org/virtual-destinations.html

以上是关于Spring-integration / ActiveMQ 在单个线程中订阅多个目的地的主要内容,如果未能解决你的问题,请参考以下文章

Spring-integration / ActiveMQ 在单个线程中订阅多个目的地

测试 Spring-Integration 与订阅者通道

在 spring-integration 中使用有效负载类型路由器通过列表通用有效负载路由消息

Spring-Integration Webflux 异常处理

使用spring-integration快速实现mysql分布锁

使用spring-integration快速实现mysql分布锁