/// <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) } }
static async Task MoveToPoisonQueue(CloudQueue queue, CloudQueue poisonQueue, CloudQueueMessage message, CancellationToken ct) { var id = message.Id; var popReceipt = message.PopReceipt; await poisonQueue.AddMessageAsync(message, null, null, null, null, ct).ConfigureAwait(false); message.UpdateChangedProperties(id, popReceipt); await queue.DeleteMessageAsync(message.Id, message.PopReceipt, null, null, ct).ConfigureAwait(false); }
private async Task HandlePoisonMessageAsync(CloudQueueMessage message, CancellationToken cancellationToken) { if (_poisonQueue != null) { // 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); } }