如何让Apache Artemis实现与经典ActiveMQ一致的通配符JMS监听行为
Apache Artemis 通配符监听适配配置方案
问题根因说明
Artemis 默认采用地址/队列分离的模型,通配符消费默认走多播路由逻辑:会自动创建对应通配符的队列并拷贝匹配的消息,不会操作原队列的消息,所以会出现你遇到的存储占用、公平消费失效的问题。
具体配置步骤
第一步:修改 broker.xml 核心配置,开启点对点通配符消费
在<core>标签下新增如下配置:
<!-- 开启队列维度的通配符路由,直接消费匹配通配符的原队列消息 --> <wildcard-routing-enabled-on-queues>true</wildcard-routing-enabled-on-queues> <!-- 配置消费者多队列轮询拉取策略,实现跨队列公平消费 --> <consumer-queue-priority-manager-class-name>org.apache.activemq.artemis.core.server.impl.RoundRobinConsumerPriorityManager</consumer-queue-priority-manager-class-name>
在<address-settings>的对应规则(匹配queue.#的地址规则)下新增如下配置:
<address-setting match="queue.#"> <!-- 强制地址路由类型为点对点,避免多播拷贝消息 --> <default-address-routing-type>ANYCAST</default-address-routing-type> <default-queue-routing-type>ANYCAST</default-queue-routing-type> <!-- 和你的测试场景对齐设为0,每次仅拉取1条消息,确保轮询粒度 --> <default-consumer-window-size>0</default-consumer-window-size> </address-setting>
注意:以上配置依赖 Apache Artemis 2.17.0 及以上版本,若当前使用版本较低请先升级至官方稳定版。
第二步:Spring JMS 端适配调整
保持原有监听代码不变,额外在配置文件中关闭自动创建不必要的目标即可:
# Spring Boot JMS 配置 spring.jms.template.delivery-mode=persistent spring.jms.listener.auto-startup=true spring.artemis.mode=native spring.artemis.client.block-on-durable-send=true
效果验证
配置生效后即可实现你需要的两个核心特性:
- 消费后原租户队列的待消费消息计数同步减少,无额外消息拷贝不会产生冗余存储
- 单队列内严格遵守FIFO,跨队列按轮询策略公平拉取消息,不会出现单租户消息阻塞其他租户的情况
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

