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。 - 当前死信配置为全局地址设置:
此配置下,未投递消息会进入 DLQ 地址下的<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>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>
配置说明
- 匹配规则:
match="Consumer.*.VirtualTopic.*"会匹配所有虚拟主题的消费队列(队列名格式为Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME)。 - 表达式化死信地址:
${originalQueue}是 Artemis 内置变量,代表消息原所在的队列名称,因此死信消息会被发送到Consumer.CLIENT_ID.VirtualTopic.QUEUE_NAME这个地址。 - 自动创建死信队列:开启
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
相关产品推荐
相关产品推荐

