Search code examples
azureazure-functionsazure-queues

Azure Queue triggered function error


When a Azure Queue triggered function fails, when will the message become available in the queue for retry?

Is it:

  • After the visibility timeout elapses

or

  • Right away on failure

Failure = function throws an Exception.


Solution

  • I can't find documentation, so maybe ask for it over in this repo https://github.com/Azure/azure-webjobs-sdk

    but looking at the code here should answer your question

        /// <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)
            }
    

    }