.NET Core 2.2,WebJobs SDK 3.0
我有一个Webjob从队列中接收消息。像这样的标准QueueTrigger
public void ProcessQueueMessage(
[QueueTrigger("%WebJobs:WorkerQueueName%")] CloudQueueMessage queueMessage,
ILogger log)
在过程结束时,我将消息写到另一个队列(存档)。
函数成功完成,但消息保留在源队列中
在Storage Explorer中,我看到了这一点(在本示例中,我有3条待处理的消息)
,此消息在10分钟后再次出队。
如何使它成功运行,以便使消息出队?
我的队列配置是
BatchSize 1
MaxDequeueCount 2
MaxPollingInterval 00:00:04
VisibilityTimeout 02:00:00
答案 0 :(得分:0)
SDK应该已经处理了。
默认情况下,该消息将被租借(或变得不可见)30秒。如果作业花费的时间更长,则将续租。除非主机崩溃或该函数引发异常,否则该消息对其他函数实例将不可用。功能成功完成后,SDK将删除该消息。
从队列中检索消息时,响应包括消息和弹出收据值,这是删除消息所必需的。 该消息不会自动从队列中删除,但是在检索到该消息之后,在
visibilitytimeout
参数指定的时间间隔内,其他客户端看不到该消息。检索消息的客户端应在处理完消息之后和响应的TimeNextVisible
元素指定的时间之前删除该消息,该时间是根据visibilitytimeout
参数的值计算的。将visibilitytimeout
的值添加到检索消息以确定TimeNextVisible
的值的时间。
因此,您无需编写任何特殊代码即可从队列中删除邮件。
答案 1 :(得分:0)
事实证明,我使用的是queueMessage
对象作为参数,直接将其放在另一个可能使SDK感到困惑的队列中。
public void ProcessQueueMessage(
[QueueTrigger("%WebJobs:WorkerQueueName%")] CloudQueueMessage queueMessage,
ILogger log)
因此,我对此进行了更改,并在将其放入另一个队列之前创建了一个新的CloudQueueMessage对象。
var newMessage = new CloudQueueMessage(queueMessage.AsString);
现在,当我的函数返回时,消息已从队列中正确删除。