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

ActiveMQ Artemis中虚拟主题死信队列匹配消费队列的配置方法

ActiveMQ Classic 迁移至 Artemis:虚拟主题死信队列配置问题

背景

我们正从 ActiveMQ "Classic" 迁移至 ActiveMQ Artemis,原 Classic 环境配置如下:

  • 虚拟主题通过 <virtualDestinationInterceptor> 配置:
    <virtualTopic name="VirtualTopic.>" prefix="Consumer.*." selectorAware="false"/>
    
  • 死信策略通过 <deadLetterStrategy> 实现,自动在队列名后追加 .Dead 创建死信队列,虚拟主题消费队列的未投递消息会进入同名后缀 .Dead 的队列。

迁移到 Artemis 后:

  • 通过 OpenWire 参数 virtualTopicConsumerWildcards=Consumer.*.>;2 实现虚拟主题功能:消费者监听队列 Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME 时,会接收发送至地址 VirtualTopic.QUEUE_NAME 的消息,对应 FQQN 为 VirtualTopic.QUEUE_NAME::Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME。
  • 当前死信配置为全局地址设置:
    <address-setting match="#">
        <dead-letter-address>DLQ</dead-letter-address>          
        <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
        <dead-letter-queue-prefix></dead-letter-queue-prefix>
        <dead-letter-queue-suffix>.Dead</dead-letter-queue-suffix>
        ...
    </address-setting>
    
    此配置下,未投递消息会进入 DLQ 地址下的 VirtualTopic.QUEUE_NAME.Dead 队列,FQQN 为 DLQ::VirtualTopic.QUEUE_NAME.Dead,不符合原 Classic 的行为。

问题

如何配置让未投递消息发送至与消费队列同名的死信队列,即 FQQN 为 Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME::Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME.Dead?

尝试过的无效配置

曾尝试使用 divert 转发死信,但未生效,消息仍进入 DLQ 地址:

<diverts>     
    <divert name="virtualTopicDeadDivert">
        <address>DLQ</address>
        <forwarding-address>Consumer.CLIENT_ID.VirtualTopic.FunctionalTest.Dead</forwarding-address>
        <!--filter string="_AMQ_ORIG_QUEUE='Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME'"/-->
        <exclusive>true</exclusive>
    </divert>
</diverts>

解决方案

利用 ActiveMQ Artemis 的表达式化死信地址功能,针对虚拟主题的消费队列单独配置地址规则,无需使用 divert:

修改 broker.xml 中的 <address-settings> 节点,添加针对虚拟主题消费队列的匹配规则:

<address-setting match="Consumer.*.VirtualTopic.*">
    <!-- 使用原队列名作为死信地址 -->
    <dead-letter-address>${originalQueue}</dead-letter-address>
    <!-- 自动创建死信资源 -->
    <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
    <!-- 死信队列前缀为空,后缀为.Dead -->
    <dead-letter-queue-prefix></dead-letter-queue-prefix>
    <dead-letter-queue-suffix>.Dead</dead-letter-queue-suffix>
    <!-- 根据业务需求设置最大投递次数,超过后进入死信 -->
    <max-delivery-attempts>3</max-delivery-attempts>
    <!-- 其他可选配置(如过期时间等) -->
</address-setting>

配置说明

  1. 匹配规则:match="Consumer.*.VirtualTopic.*" 会匹配所有虚拟主题的消费队列(队列名格式为 Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME)。
  2. 表达式化死信地址:${originalQueue} 是 Artemis 内置变量,代表消息原所在的队列名称,因此死信消息会被发送到 Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME 这个地址。
  3. 自动创建死信队列:开启 auto-create-dead-letter-resources 后,Artemis 会自动在目标地址下创建名为 Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME.Dead 的死信队列,最终 FQQN 为 Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME::Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME.Dead,完全匹配原 Classic 的行为。

此配置无需额外 divert,直接通过地址规则实现需求,更高效且符合 Artemis 的原生设计。

内容的提问来源于stack exchange,提问作者Antoine Wils

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:15:33