ActiveMQ Artemis 2.26.0:如何配置72小时渐进退避重试后转DLQ
解决方案
问题出在你未配置max-delivery-attempts参数,它的默认值为10,导致消息仅重试10次就被转入死信队列,和你设置的渐进退避延迟参数无关。要实现“消息以渐进退避方式最多重试72小时后转入DLQ”的需求,需按以下方式调整配置:
1. 确定合适的max-delivery-attempts值
结合你设置的退避参数:
- 初始重试延迟:30秒(30000ms)
- 延迟乘数:2.5
- 最大重试延迟:72小时(259200000ms)
计算每次重试的延迟时间及总时长:
- 第1次重试延迟:30000ms
- 第2次:75000ms
- 第3次:187500ms
- 第4次:468750ms
- 第5次:1171875ms
- 第6次:2929687.5ms
- 第7次:7324218.75ms
- 第8次:18310546.875ms
- 第9次:45776367.1875ms
- 第10次:114440917.96875ms
- 第11次及之后:259200000ms(达到最大延迟上限)
前10次重试的总延迟约53小时,第11次重试延迟为72小时。若希望总重试时长不超过72小时,可将max-delivery-attempts设为10;若允许最后一次重试延迟满72小时后再转入DLQ,可设为11。
2. 修改broker.xml配置
在exampleQueue的地址设置中添加max-delivery-attempts参数,保留原有退避配置:
<address-settings> <!--override the redelivery-delay for the example queue--> <address-setting match="exampleQueue"> <redelivery-delay>30000</redelivery-delay> <redelivery-delay-multiplier>2.5</redelivery-delay-multiplier> <dead-letter-address>deadLetterQueue</dead-letter-address> <max-redelivery-delay>259200000</max-redelivery-delay> <!-- 设置足够大的重试次数,确保总重试时长覆盖72小时 --> <max-delivery-attempts>11</max-delivery-attempts> </address-setting> </address-settings> <addresses> <address name="deadLetterQueue"> <anycast> <queue name="deadLetterQueue"/> </anycast> </address> <address name="exampleQueue"> <anycast> <queue name="exampleQueue"/> </anycast> </address> </addresses>
3. 补充说明
若希望消息在72小时后无论重试次数多少都进入DLQ,可结合expiry-delay参数(设为259200000ms),并将过期消息指向死信队列:
<address-setting match="exampleQueue"> <!-- 其他配置不变 --> <expiry-delay>259200000</expiry-delay> <expiry-address>deadLetterQueue</expiry-address> </address-setting>
内容的提问来源于stack exchange,提问作者Themikebe
相关产品推荐
相关产品推荐

