14

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

在此链接Windows Azure Queues: Improvement Leases, Progress Tracking, and Scheduling of Future Work上,作者指出“消息的租约可以由执行原始出队的工作人员延长,以便它可以继续处理消息

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

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

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

4

2 回答 2

13

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

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

编辑(长答案)

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

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

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

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

最终,在类UpdateQueueMessageVisibilityCommand[3] 中,您会发现UpdateMessageAsync队列中的方法以同样的 10 分钟更新被调用。

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

[1] Azure 存储队列和多个 WebJobs 实例:QueueTrigger 会在触发时设置消息租用时间吗?

[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

于 2016-02-24T06:25:09.523 回答
-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 秒。

于 2016-02-16T06:36:02.693 回答