谢谢你的帮助!!!我是 Artemis 的新手,但它的潜力真的让我很惊讶!
我正在使用ActiveMQ Artemis和一个使用Qpid Proton (版本)构建的 Python 客户端0.39.0
。我试图了解如何在 Proton Python 中拒绝或释放一条消息,以便 Artemis尝试重新发送,并遵循<max-delivery-attempts>
中配置的设置broker.xml
。
以下是上下文:
- Artemis 版本: 2.40.0(Docker)
- Qpid Proton Python版本: 0.39.0
- Python 客户端:使用以下方式消费消息
proton.handlers.MessagingHandler
- 预期行为:如果客户端无法处理消息(例如内部错误),客户端应向 Artemis 发出信号,要求其重试投递。在达到配置的重试次数 (
max-delivery-attempts
) 后,Artemis 应将消息移至DLQ。
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>
Python客户端逻辑:
在中on_message
,我们在HTTP回调失败时发布消息:
self.release(event.delivery, delivered=True)
我们还尝试了:
self.settle(event.delivery, state=Delivery.RELEASED)
但这两种方法似乎都没能让 Artemis增加投递计数。Artemis 一直无限地投递同一条消息,并且永远不会将其移动到 DLQ。
我们也尝试添加这个(在 Artemis 文档中建议),但 Artemis 无法启动:
<persist-delivery-count-before-delivery>true</persist-delivery-count-before-delivery>
问题:
在Qpid Proton Python中发布或拒绝消息的正确方法是什么,以便 Artemis:
- 将其视为一次失败的递送尝试,并且
- 最终将其发送到DLQ后
max-delivery-attempts
?
再次感谢!!
解决方案:我在发布消息之前没有更新本地状态对象。因此,为了将 max-delivery-attempts 策略与 broker.xml 中定义的 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:
# Explicitly NACK the message
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)