我正在使用Azure WebJobs轮询队列,然后处理该消息。
部分消息处理包括命中第三方HTTP端点。 (例如天气api或一些股市api)。
现在,如果对api的命中失败(网络错误,500错误,无论如何)我在我的代码中尝试/捕获这个,记录什么然后......什么??
如果我继续...那么我假设该消息将被WebJobs SDK删除。
我怎么能:
1)对SDK说 - 请不要删除此消息(因此,当消息再次可见时,将在下一个队列轮询和时自动重试)。
2)当SDK从队列中弹出消息进行处理时,设置不可见时间值。
谢谢!
答案 0 :(得分:7)
现在,如果对api的命中失败(网络错误,500错误,无论如何)我在我的代码中尝试/捕获这个,记录什么然后......什么??
Webjobs SDK的行为如下:如果您的方法抛出未捕获的异常,则会将消息返回到具有dequeueCount
属性+1的队列。否则,如果一切顺利,该消息将被视为已成功处理,并从队列中删除 - 即queue.DeleteMessage(retrievedMessage);
所以不要优雅地捕获HTTP 500,抛出异常以便SDK获得提示。
如果我继续..那么我认为该消息将被WebJobs SDK删除。
如果方法在完成之前失败,则不删除队列消息;在10分钟的租约到期后,该消息将被释放以便再次接收并处理。如果消息总是导致异常,则该序列将不会无限重复。在尝试处理消息5次失败后,消息将移至名为
{queuename}-poison
的队列。最大尝试次数是可配置的。
如果您真的不喜欢硬编码的10分钟可见性超时(消息保持隐藏消费者的时间),您可以更改它。请参阅@mathewc的回答:
来自https://stackoverflow.com/a/34093943/4148708:
在最新的v1.1.0版本中,您现在可以通过
QueueProcessor
注册自己的自定义JobHostConfiguration.Queues.QueueProcessorFactory
实例来控制可见性超时。这允许您全局或按队列/功能控制高级消息处理行为。
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);
}