从ActiveMQ Classic迁移至Artemis:双工联邦Anycast消息转发问题
ActiveMQ Artemis 复刻 Classic 双工队列转发方案
你遇到的问题根源在于Artemis的地址联邦仅支持multicast(主题)地址,官方文档明确说明:
联邦地址可以将从上游地址发布的消息复制到本地地址。注意:仅支持多播地址。
要实现Classic中队列(anycast)的双向消息转发,需要改用队列联邦(Federated Queues),而非地址联邦。以下是具体配置方案:
核心配置思路
队列联邦专门用于同步anycast队列的消息,支持将上游队列的消息复制到本地,让本地消费者能接收上游队列的消息。要实现A、B代理的双向转发,两台代理都需要配置指向对方的上游和队列匹配策略。
代理B(次级)配置
在broker.xml中添加联邦配置,指定上游指向代理A,并匹配所有队列:
<!-- 定义到代理A的连接器 --> <connectors> <connector name="connector-to-A">tcp://A的IP:61616</connector> </connectors> <federations> <federation name="federation-to-A"> <!-- 上游配置:连接到代理A --> <upstream name="upstream-to-A"> <static-connectors> <connector-ref>connector-to-A</connector-ref> </static-connectors> <!-- 引用队列匹配策略 --> <policy-set-ref>all-queues-policy</policy-set-ref> </upstream> </federation> </federations> <!-- 定义匹配所有队列的策略 --> <policy-sets> <policy-set name="all-queues-policy"> <queues> <!-- # 匹配所有队列 --> <queue-match pattern="#"/> </queues> </policy-set> </policy-sets>
代理A配置
同样在broker.xml中添加指向代理B的联邦配置,实现双向转发:
<!-- 定义到代理B的连接器 --> <connectors> <connector name="connector-to-B">tcp://B的IP:61616</connector> </connectors> <federations> <federation name="federation-to-B"> <upstream name="upstream-to-B"> <static-connectors> <connector-ref>connector-to-B</connector-ref> </static-connectors> <policy-set-ref>all-queues-policy</policy-set-ref> </upstream> </federation> </federations> <policy-sets> <policy-set name="all-queues-policy"> <queues> <queue-match pattern="#"/> </queues> </policy-set> </policy-sets>
效果验证
- 生产者在A发送消息到队列
queue1,代理B上订阅queue1的消费者会收到该消息 - 生产者在B发送消息到队列
queue1,代理A上订阅queue1的消费者会收到该消息 - 主题(multicast地址)的转发可保留原地址联邦配置,与队列联邦共存
内容的提问来源于stack exchange,提问作者rb612
相关产品推荐
相关产品推荐

