我有一个webjob,它只使用条件(DevliverCount = 1)处理消息一次。因为如果锁定时间由第一个webjob过期,我不希望其他实例处理它。当其他webjob尝试在锁定时间到期后处理消息时,条件(DevliverCount = 1)将不会满足,并且会自动从队列中删除消息。 这里的问题是,如果消息状态转到从未完成(成功除外),我将不会在队列中处理消息。如何处理这种情况?
答案 0 :(得分:0)
我认为部分问题在于您尝试使用MaxDeliveryCount属性来阻止并发消息处理:
最大传送计数设置不用于防止多个消费者同时处理消息,它用于防止"有害消息"任何消费者试图处理其内容阻止成功处理的消息,因此消息将被永久处理。
我建议你确切地确定你想要完成的是什么。如果您想要一个简单的竞争消费者场景,其中多个webjobs使用来自单个队列的消息,那么有标准的方法可以实现这一点:
good description of competing consumers
competing consumers with Service Bus queues
您可以将MaxDeliveryCount与竞争消费者结合使用...如果您想要防止有害消息,您可以将MaxDeliveryCount设置为大于1的值,并且仍然可以让其他消费者有机会处理其锁定到期的消息。
Azure Service Bus支持超过最大传送次数的有害消息的死字,因此您可以离线检查此类消息......它们不会被永久删除。
你可能还需要在你的webjobs中添加代码,以便在它们到期之前更新锁定...否则服务总线就无法区分需要很长时间处理的有效消息"和#34;无法处理的有害信息"。如果没有锁定续订,那么长时间运行的有效消息将像毒药消息一样被删除,这几乎肯定不是你想要的。
祝你好运!