Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Webjobs是否自动续订Azure队列消息的租约?_C#_Azure_Azure Webjobs_Azure Storage Queues - Fatal编程技术网

C# Webjobs是否自动续订Azure队列消息的租约?

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 它成功地完成了。在这段时间内,没有其

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

在该链接上,作者声明“原始出列的工作人员可以扩展消息租约,以便继续处理消息”

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

//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