【问题标题】:Azure Queue triggered function errorAzure 队列触发函数错误
【发布时间】:2017-08-23 09:11:30
【问题描述】:

当 Azure Queue 触发函数失败时,消息何时可以在队列中重试?

是吗:

  • 可见性超时后

  • 立即失败

失败 = 函数抛出 Exception

【问题讨论】:

    标签: azure azure-functions azure-queues


    【解决方案1】:

    我找不到文档,所以可以在这个 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)
            }
    

    }

    【讨论】:

      【解决方案2】:

      它会立即再次被拾取。我运行了一个示例失败的队列触发函数,它在几秒钟内被触发了 5 次。尝试 5 次后,该项目已移至 xyz-poison 队列。

      【讨论】:

      • 我认为您没有有关该行为的文档链接。因为stackoverflow.com/a/40011705/1183475而问,那是在 16 年 10 月,他们说他们会让他们马上重试,我现在也自己试试……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2021-03-01
      • 2017-03-14
      • 2018-03-26
      • 2021-07-07
      • 2019-08-04
      相关资源
      最近更新 更多