在ActiveMQ Artemis中使用完全限定队列名(FQQN)实现持久化订阅的问题
在ActiveMQ Artemis中使用完全限定队列名(FQQN)实现持久化订阅的问题
嘿,我完全懂你现在的困扰——想用FQQN来模拟JMS里那种持久化的共享订阅,结果现在只能实现共享,没法做到持久化,消费者一关闭队列就被删掉了。其实核心原因是默认通过FQQN自动创建的队列是临时队列,消费者断开后就会被清理,咱们得换个思路,提前创建持久化的队列才行,具体操作如下:
1. 预先创建持久化的共享队列
你需要用Artemis核心客户端的API,手动创建一个持久化队列,关联到你要订阅的通配地址,同时配置成支持多消费者(也就是共享订阅的效果)。这样队列就不会因为消费者断开而被删除了。
示例代码如下:
// 先获取已经创建好的ClientSession(这里假设你已经完成了客户端的初始化) ClientSession session = ...; // 创建持久化队列,关联到通配地址(比如"topic.>") QueueConfiguration queueConfig = new QueueConfiguration("my_durable_shared_queue") .setAddress("topic.>") // 你的通配订阅地址 .setDurable(true) // 标记队列为持久化 .setRoutingType(RoutingType.MULTICAST) // 匹配topic类型地址的多播路由 .setMaxConsumers(0); // 允许任意数量的消费者连接,实现共享订阅 session.createQueue(queueConfig);
2. 用FQQN订阅这个持久化队列
队列创建好之后,你直接用FQQN格式的地址来创建消费者就行,比如queue://my_durable_shared_queue。这时候即使消费者关闭,队列依然会保留,未消费的消息也会存在队列里,下次消费者重新连接就能继续处理。
示例代码:
// 创建消费者,订阅预先创建的持久化队列 ClientConsumer consumer = session.createConsumer("queue://my_durable_shared_queue");
额外注意点
- 确保队列的路由类型和目标地址的路由类型匹配:如果你订阅的是topic风格的地址,一定要用
MULTICAST路由类型;如果是queue风格的地址则用ANYCAST。 - 如果你不需要限制消费者数量,就把
setMaxConsumers设为0,这样可以支持任意多的消费者同时订阅,实现共享订阅的负载均衡效果。
备注:内容来源于stack exchange,提问作者Apion
相关产品推荐
相关产品推荐

