You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveMQ Artemis通配符队列消费后原队列消息未消失如何解决?

问题根因

你当前的实现创建了两个完全独立的地址test.A和test.#,每个地址下各绑定一个同名队列。ActiveMQ Artemis默认会将发送到test.A的消息复制一份,投递到匹配通配符规则的test.#地址下的队列,因此两个队列中各存储了一份独立的消息拷贝。你消费test.#队列的消息时,只会删除该队列内的拷贝,不会影响test.A队列的消息,这就是测试断言失败的核心原因。

解决方案

推荐使用Artemis原生的通配符消费能力实现需求,不需要创建独立的test.#地址和队列,通配符消费会直接匹配所有符合规则的原队列消息,消费确认后会直接删除原队列中的消息,完全符合你的预期。
需要修改的代码如下:

  1. 调整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;
}
  1. 调整队列创建逻辑,删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:27:03