C# Webjobs是否自动续订Azure队列消息的租约?
当Webjobs通过QueueTrigger从Azure存储上的队列获取消息时,它将租用该消息(使其不可见)。如果(webjob的)触发功能需要很长时间来处理消息,此租约是否会自动延长?或者我应该在函数中处理它 在该链接上,作者声明“原始出列的工作人员可以扩展消息租约,以便继续处理消息” 注意:我尝试了一个等待20分钟的webjob(带有QueueTrigger)C# Webjobs是否自动续订Azure队列消息的租约?,c#,azure,azure-webjobs,azure-storage-queues,C#,Azure,Azure Webjobs,Azure Storage Queues,当Webjobs通过QueueTrigger从Azure存储上的队列获取消息时,它将租用该消息(使其不可见)。如果(webjob的)触发功能需要很长时间来处理消息,此租约是否会自动延长?或者我应该在函数中处理它 在该链接上,作者声明“原始出列的工作人员可以扩展消息租约,以便继续处理消息” 注意:我尝试了一个等待20分钟的webjob(带有QueueTrigger) //Write Log Thread.Sleep(1200000); //Write Log 它成功地完成了。在这段时间内,没有其
//Write Log
Thread.Sleep(1200000);
//Write Log
它成功地完成了。在这段时间内,没有其他webjob实例尝试对同一队列项进行尝试(该队列项不可见)。因此,似乎存在租赁的自动续订机制。无论如何,我正在等待Microsoft员工或官方链接(msdn、azure等)的答复。您可以使用以下方法(Java代码):
从azure存储上的队列获取消息。默认情况下,它将在30秒后可见
如果要延长租约,可以使用以下代码:
CloudQueueMessage updateMessage = queue.retrieveMessage();
EnumSet<MessageUpdateFields> updateFields = EnumSet.of(MessageUpdateFields.CONTENT, MessageUpdateFields.VISIBILITY);
queue.updateMessage(updateMessage, 60, updateFields, null, null);
CloudQueueMessage updateMessage=queue.retrieveMessage();
EnumSet updateFields=EnumSet.of(MessageUpdateFields.CONTENT,MessageUpdateFields.VISIBILITY);
updateMessage(updateMessage,60,updateFields,null,null);
这意味着您的邮件可以再处理60秒。是的,您的租约将自动延长。每次10分钟 请参见此处的回答[1],该回答由一名Microsoft员工引用azure.Microsoft.com[2]上的文档和评论 编辑(长答案) 此外,从处的
QueueListener
类开始检查源代码也表明了这一点
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]
[2]
[3] 我知道这一点。然而,在我的例子中,我是通过webjob sdk(c#)的QueueTrigger属性获取队列消息的,如“公共静态异步任务进程QueueMessage([QueueTrigger(“queue#name”)]BlobInformation blobInfo”中所示。我想在这种情况下,这是在幕后处理的。我只是想确定一下。在我的试验中,webjob进程耗时90秒,队列消息在队列中不可见。webjob sdk中有一个“轮询算法”。您的webjob似乎将继续处理,直到达到最大等待时间。你能检查消息的最大等待时间吗?@AlexChen WX那篇文章中描述的轮询算法只与WebJob检查新队列消息的频率有关。因为每一张支票都会产生一笔存储交易,所以你可以用它来控制你的成本。这个问题的答案之一属于我。这意味着我看到了那个问题,显然还有另一个答案。我也阅读了给出的链接,很久以前就做过这个例子。我在那些建议“你的租约自动延长,每次10分钟”的文章中找不到任何东西。也许我错过了什么。你能具体说明你得出这个结果的段落吗?@NuriTasdemir对不起,我没有看海报的名字。你说得对,这篇文章没有提到时间的延长和延长的时间。因此,我查看了GitHub()上的源代码。第138行对10分钟窗口进行了硬编码。然后,该值被传递给一些方法调用,并在计时器的第250行再次使用,该计时器将更新消息以重置可见性超时。@NuriTasdemir这有点复杂,因为它将在中途开始重置可见性超时。因此,在前5分钟的处理时间之后,它将延长10分钟,以此类推。有人通过
LinearSpeedupStrategy
使用UpdateQueueMessageVisibilityCommand
等。但底线是,每次都代表您的WebJob延长10分钟。
TimeSpan visibilityTimeout = TimeSpan.FromMinutes(10); // long enough to process the job