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

如何通过Qpid Proton Python让ActiveMQ Artemis正确处理消息重发及DLQ?

ActiveMQ Artemis + Qpid Proton Python:实现消息重发并触发DLQ规则

上下文信息

  • Artemis版本:2.40.0(Docker部署)
  • Qpid Proton Python版本:0.39.0
  • Python客户端:基于proton.handlers.MessagingHandler实现消息消费
  • 预期行为:客户端处理消息失败时(如内部错误),通知Artemis重试投递;达到max-delivery-attempts配置的次数后,消息自动转入DLQ(死信队列)

Broker配置(broker.xml)

<address-setting match="#">
   <max-delivery-attempts>5</max-delivery-attempts>
   <redelivery-delay>5000</redelivery-delay>
   <dead-letter-address>DLQ</dead-letter-address>
   <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
   <dead-letter-queue-suffix>.DLQ</dead-letter-queue-suffix>
</address-setting>

此前尝试的客户端逻辑

在on_message方法中,处理失败时尝试以下两种方式,但均未触发投递计数增加,消息被无限重复投递,从未进入DLQ:

  1. 释放消息:
self.release(event.delivery, delivered=True)
  1. 标记为已释放状态:
self.settle(event.delivery, state=Delivery.RELEASED)

另外尝试添加Artemis文档建议的<persist-delivery-count-before-delivery>true</persist-delivery-count-before-delivery>配置,导致Broker启动失败。

核心问题

如何在Qpid Proton Python中正确拒绝/释放消息,让Artemis:

  1. 将此次投递计为失败尝试;
  2. 达到max-delivery-attempts后自动将消息转入DLQ?

解决方案

问题根源在于释放消息前未更新本地状态对象。需显式设置本地投递状态,告知Broker此次投递失败,从而触发投递计数累加与DLQ规则:

def on_message(self, event):
    message = event.message
    status = send_message_callback(self.enrollment["target_url"], message.body)

    if 200 <= status < 300:
        self.accept(event.delivery)
    else:
        # 显式标记消息投递失败
        local_state = event.delivery.local
        local_state.failed = True
        local_state.undeliverable = False
        local_state.type = event.delivery.MODIFIED
        event.delivery.update(local_state)
        self.release(event.delivery, delivered=True)

内容的提问来源于stack exchange,提问作者Daniel Nascimento

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:55:53