Webjobs会自动续订Azure Queue消息的租约吗?

时间:2016-02-15 14:34:20

标签: c# azure azure-webjobs azure-storage-queues

当Webjobs通过QueueTrigger从Azure存储上的队列中获取消息时,它会租用该消息(使其不可见)。如果(webjob的)触发功能需要很长时间来处理消息,这个租约是否会自动扩展?或者我应该在函数中处理它?<​​/ p>

在此链接Windows Azure Queues: Improved Leases, Progress Tracking, and Scheduling of Future Work上,作者声明“消息上的租约可以由执行原始出列的工作人员扩展,以便它可以继续处理消息”< / p>

注意:我尝试了一个等待20分钟的webjob(带有QueueTrigger)。

//Write Log
Thread.Sleep(1200000);
//Write Log

成功完成。在此期间,没有其他webjob实例尝试尝试相同的队列项(它没有变得可见)。因此,似乎存在租赁的自动更新机制。无论如何,我正在等待微软员工的回答或官方链接(msdn,azure,......)。

2 个答案:

答案 0 :(得分:12)

是的,您的租约会自动延长。每次10分钟。

请参阅此处的答案[1],微软员工参考azure.microsoft.com上的文档和评论[2]。

编辑(长答案)

此外,从https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.csQueueListener类开始检查源代码表示相同。

QueueListener中的代码在第138行有相关部分,其中定义了10分钟visibilityTimeout变量:

TimeSpan visibilityTimeout = TimeSpan.FromMinutes(10); // long enough to process the job

然后将该变量传递给ProcessMessageAsync,这将启动方法CreateUpdateMessageVisibilityTimer中定义的具有相同值的计时器。 10分钟值用于确定第一次和下次更新可见性超时的时间(通过将其减半并创建LinearSpeedupStrategy类的实例)。

最后,在班级UpdateQueueMessageVisibilityCommand [3]中,您会发现队列中的UpdateMessageAsync方法被调用,同样的10分钟续订。

LinearSpeedupStrategy将在5分钟后再次续订,除非续订失败,在这种情况下,它将在1分钟后再次尝试(如QueueListener中所定义)。

[1] Azure Storage Queue and multiple WebJobs instances: will QueueTrigger set the message lease time on triggered?

[2] https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/

[3] https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/UpdateQueueMessageVisibilityCommand.cs

答案 1 :(得分:-2)

您可以使用方法(Java代码):

queue.retrieveMessage()

从azure存储上的队列中获取消息。默认情况下,它将在30秒后显示。

如果您想延长租约,可以使用以下代码:

CloudQueueMessage updateMessage = queue.retrieveMessage();
EnumSet<MessageUpdateFields> updateFields = EnumSet.of(MessageUpdateFields.CONTENT, MessageUpdateFields.VISIBILITY);
queue.updateMessage(updateMessage, 60, updateFields, null, null);

这意味着您的信息将能够再处理60秒。