处理邮件时,我的Webjob之前从未完成的状态

时间:2016-05-11 07:28:44

标签: azure queue azure-servicebus-queues webjob

我有一个webjob,它只使用条件(DevliverCount = 1)处理消息一次。因为如果锁定时间由第一个webjob过期,我不希望其他实例处理它。当其他webjob尝试在锁定时间到期后处理消息时,条件(DevliverCount = 1)将不会满足,并且会自动从队列中删除消息。 这里的问题是,如果消息状态转到从未完成成功除外),我将不会在队列中处理消息。如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

我认为部分问题在于您尝试使用MaxDeliveryCount属性来阻止并发消息处理:

MaxDeliveryCount

最大传送计数设置不用于防止多个消费者同时处理消息,它用于防止"有害消息"任何消费者试图处理其内容阻止成功处理的消息,因此消息将被永久处理。

我建议你确切地确定你想要完成的是什么。如果您想要一个简单的竞争消费者场景,其中多个webjobs使用来自单个队列的消息,那么有标准的方法可以实现这一点:

good description of competing consumers

competing consumers with Service Bus queues

您可以将MaxDeliveryCount与竞争消费者结合使用...如果您想要防止有害消息,您可以将MaxDeliveryCount设置为大于1的值,并且仍然可以让其他消费者有机会处理其锁定到期的消息。

Azure Service Bus支持超过最大传送次数的有害消息的死字,因此您可以离线检查此类消息......它们不会被永久删除。

你可能还需要在你的webjobs中添加代码,以便在它们到期之前更新锁定...否则服务总线就无法区分需要很长时间处理的有效消息"和#34;无法处理的有害信息"。如果没有锁定续订,那么长时间运行的有效消息将像毒药消息一样被删除,这几乎肯定不是你想要的。

祝你好运!