如何阻止Azure WebJobs队列消息从Azure队列中删除?

时间:2016-08-21 03:18:51

标签: azure azure-webjobs

我正在使用Azure WebJobs轮询队列,然后处理该消息。

部分消息处理包括命中第三方HTTP端点。 (例如天气api或一些股市api)。

现在,如果对api的命中失败(网络错误,500错误,无论如何)我在我的代码中尝试/捕获这个,记录什么然后......什么??

如果我继续...那么我假设该消息将被WebJobs SDK删除。

我怎么能:

1)对SDK说 - 请不要删除此消息(因此,当消息再次可见时,将在下一个队列轮询时自动重试)。
2)当SDK从队列中弹出消息进行处理时,设置不可见时间值。

谢谢!

1 个答案:

答案 0 :(得分:7)

  

现在,如果对api的命中失败(网络错误,500错误,无论如何)我在我的代码中尝试/捕获这个,记录什么然后......什么??

Webjobs SDK的行为如下:如果您的方法抛出未捕获的异常,则会将消息返回到具有dequeueCount属性+1的队列。否则,如果一切顺利,该消息将被视为已成功处理,并从队列中删除 - 即queue.DeleteMessage(retrievedMessage);

所以不要优雅地捕获HTTP 500,抛出异常以便SDK获得提示。

  

如果我继续..那么我认为该消息将被WebJobs SDK删除。

来自https://github.com/Azure/azure-content/blob/master/articles/app-service-web/websites-dotnet-webjobs-sdk-get-started.md#contosoadswebjob---functionscs---generatethumbnail-method

  

如果方法在完成之前失败,则不删除队列消息;在10分钟的租约到期后,该消息将被释放以便再次接收并处理。如果消息总是导致异常,则该序列将不会无限重复。在尝试处理消息5次失败后,消息将移至名为{queuename}-poison的队列。最大尝试次数是可配置的。

如果您真的不喜欢硬编码的10分钟可见性超时(消息保持隐藏消费者的时间),您可以更改它。请参阅@mathewc的回答:

来自https://stackoverflow.com/a/34093943/4148708

  

在最新的v1.1.0版本中,您现在可以通过QueueProcessor注册自己的自定义JobHostConfiguration.Queues.QueueProcessorFactory实例来控制可见性超时。这允许您全局或按队列/功能控制高级消息处理行为。

https://github.com/Azure/azure-webjobs-sdk-samples/blob/master/BasicSamples/MiscOperations/CustomQueueProcessorFactory.cs#L63

protected override async Task ReleaseMessageAsync(CloudQueueMessage message, FunctionResult result, TimeSpan visibilityTimeout, CancellationToken cancellationToken)
{
      // demonstrates how visibility timeout for failed messages can be customized
      // the logic here could implement exponential backoff, etc.
      visibilityTimeout = TimeSpan.FromSeconds(message.DequeueCount);

      await base.ReleaseMessageAsync(message, result, visibilityTimeout, cancellationToken);
}