【发布时间】:2017-08-23 09:11:30
【问题描述】:
当 Azure Queue 触发函数失败时,消息何时可以在队列中重试?
是吗:
- 可见性超时后
或
- 立即失败
失败 = 函数抛出 Exception。
【问题讨论】:
标签: azure azure-functions azure-queues
当 Azure Queue 触发函数失败时,消息何时可以在队列中重试?
是吗:
或
失败 = 函数抛出 Exception。
【问题讨论】:
标签: azure azure-functions azure-queues
我找不到文档,所以可以在这个 repo https://github.com/Azure/azure-webjobs-sdk 中询问它
但查看代码 here 应该可以回答您的问题
/// <summary>
/// This method completes processing of the specified message, after the job function has been invoked.
/// </summary>
/// <remarks>
/// If the message was processed successfully, the message should be deleted. If message processing failed, the
/// message should be release back to the queue, or if the maximum dequeue count has been exceeded, the message
/// should be moved to the poison queue (if poison queue handling is configured for the queue).
/// </remarks>
/// <param name="message">The message to complete processing for.</param>
/// <param name="result">The <see cref="FunctionResult"/> from the job invocation.</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/> to use</param>
/// <returns></returns>
public virtual async Task CompleteProcessingMessageAsync(CloudQueueMessage message, FunctionResult result, CancellationToken cancellationToken)
{
if (result.Succeeded)
{
await DeleteMessageAsync(message, cancellationToken);
}
else if (_poisonQueue != null)
{
if (message.DequeueCount >= MaxDequeueCount)
{
// These values may change if the message is inserted into another queue. We'll store them here and make sure
// the message always has the original values before we pass it to a customer-facing method.
string id = message.Id;
string popReceipt = message.PopReceipt;
await CopyMessageToPoisonQueueAsync(message, _poisonQueue, cancellationToken);
// TEMP: Re-evaluate these property updates when we update Storage SDK: https://github.com/Azure/azure-webjobs-sdk/issues/1144
message.UpdateChangedProperties(id, popReceipt);
await DeleteMessageAsync(message, cancellationToken);
}
else
{
await ReleaseMessageAsync(message, result, VisibilityTimeout, cancellationToken);
}
}
else
{
// For queues without a corresponding poison queue, leave the message invisible when processing
// fails to prevent a fast infinite loop.
// Specifically, don't call ReleaseMessage(message)
}
}
【讨论】:
它会立即再次被拾取。我运行了一个示例失败的队列触发函数,它在几秒钟内被触发了 5 次。尝试 5 次后,该项目已移至 xyz-poison 队列。
【讨论】: