/// <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)
            }
        }
Exemple #2
0
        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);
            }
        }