ActiveMQ Artemis通配符队列消费后原队列消息未消失如何解决?
问题根因
你当前的实现创建了两个完全独立的地址test.A和test.#,每个地址下各绑定一个同名队列。ActiveMQ Artemis默认会将发送到test.A的消息复制一份,投递到匹配通配符规则的test.#地址下的队列,因此两个队列中各存储了一份独立的消息拷贝。你消费test.#队列的消息时,只会删除该队列内的拷贝,不会影响test.A队列的消息,这就是测试断言失败的核心原因。
解决方案
推荐使用Artemis原生的通配符消费能力实现需求,不需要创建独立的test.#地址和队列,通配符消费会直接匹配所有符合规则的原队列消息,消费确认后会直接删除原队列中的消息,完全符合你的预期。
需要修改的代码如下:
- 调整Broker配置,显式开启通配符路由(默认已开启,显式配置更清晰)
private static EmbeddedActiveMQ createEmbeddedBroker() throws Exception { var config = new ConfigurationImpl(); config.addAcceptorConfiguration("vm", AMQ); config.setSecurityEnabled(false); config.setPersistenceEnabled(false); // 开启通配符路由 config.setWildcardRoutingEnabled(true); var server = new EmbeddedActiveMQ(); server.setConfiguration(config); server.start(); return server; }
- 调整队列创建逻辑,删除
test.#队列的创建代码,仅保留业务队列的创建
private static void createQueues(ClientSessionFactory csf) throws Exception { var session = csf.createSession(); var testA = new QueueConfiguration("test.A") .setRoutingType(RoutingType.ANYCAST) .setAddress("test.A"); session.createQueue(testA); session.close(); }
修改完成后运行测试即可符合预期:发送到test.A的消息会存储在test.A队列中,通过test.#通配符消费消息时,会直接消费test.A队列中的原始消息,确认后test.A队列的消息数会变为0。
内容的提问来源于stack exchange,提问作者Lasse L
相关产品推荐
相关产品推荐

