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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:30:02