webjob QueueTrigger不会从队列中删除消息

时间:2020-06-11 20:31:30

标签: azure azure-webjobs azure-webjobssdk

.NET Core 2.2,WebJobs SDK 3.0

我有一个Webjob从队列中接收消息。像这样的标准QueueTrigger

public void ProcessQueueMessage(
              [QueueTrigger("%WebJobs:WorkerQueueName%")] CloudQueueMessage queueMessage, 
              ILogger log)

在过程结束时,我将消息写到另一个队列(存档)。

函数成功完成,但消息保留在源队列中

在Storage Explorer中,我看到了这一点(在本示例中,我有3条待处理的消息)

enter image description here

,此消息在10分钟后再次出队。

如何使它成功运行,以便使消息出队?

我的队列配置是

BatchSize             1  
MaxDequeueCount       2  
MaxPollingInterval    00:00:04  
VisibilityTimeout     02:00:00

2 个答案:

答案 0 :(得分:0)

SDK应该已经处理了。

默认情况下,该消息将被租借(或变得不可见)30秒。如果作业花费的时间更长,则将续租。除非主机崩溃或该函数引发异常,否则该消息对其他函数实例将不可用。功能成功完成后,SDK将删除该消息。

从队列中检索消息时,响应包括消息和弹出收据值,这是删除消息所必需的。 该消息不会自动从队列中删除,但是在检索到该消息之后,在visibilitytimeout参数指定的时间间隔内,其他客户端看不到该消息。检索消息的客户端应在处理完消息之后和响应的TimeNextVisible元素指定的时间之前删除该消息,该时间是根据visibilitytimeout参数的值计算的。将visibilitytimeout的值添加到检索消息以确定TimeNextVisible的值的时间。

因此,您无需编写任何特殊代码即可从队列中删除邮件。

有关更多详细信息,请参阅此article和此one

答案 1 :(得分:0)

事实证明,我使用的是queueMessage对象作为参数,直接将其放在另一个可能使SDK感到困惑的队列中。

public void ProcessQueueMessage(
              [QueueTrigger("%WebJobs:WorkerQueueName%")] CloudQueueMessage queueMessage, 
              ILogger log)

因此,我对此进行了更改,并在将其放入另一个队列之前创建了一个新的CloudQueueMessage对象。

var newMessage = new CloudQueueMessage(queueMessage.AsString);

现在,当我的函数返回时,消息已从队列中正确删除。

相关问题