【问题标题】:How to fetch and remove several messages from Azure Storage Queue by CloudQueue.GetMessagesAsync() method?如何通过 CloudQueue.GetMessagesAsync() 方法从 Azure 存储队列中获取和删除多条消息?
【发布时间】:2019-09-11 03:36:00
【问题描述】:

我有一个TimerTrigger Azure 函数,它每分钟触发一次。 当它触发时,我通过以下代码从队列中读取特定数量的消息:

cloudQueue.GetMessagesAsync(32);

当我完成它时,我看到消息在队列中再次可见,尽管函数没有遇到任何错误

我看过这些答案,但他们都说如果您的函数在运行时没有错误,则应从队列中删除消息:

Azure Queue Storage triggered without removing message

Azure Function and storage queue, what to do if function fails

但是我的消息没有被删除。

这是我的功能代码:

[FunctionName("MyFunctionName")]
public static async Task SchedulerFunction([TimerTrigger("0 */1 * * * *", RunOnStartup = false)]TimerInfo myTimer, [Queue("my-queue-name", Connection = "AzureWebJobsStorage")]CloudQueue cloudQueue)
{
    var messages = await cloudQueue.GetMessagesAsync(32);

    await ProcessSomethingOnMessagesWithoutAnyErrors(messages);
}

我需要的是在我通过cloudQueue.GetMessagesAsync(32); 得到它们之后从队列中删除收集的消息,如果它失败了 3 次,然后将它们移动到my-queue-name-poison 队列中。 如果我需要使用任何特定的RetryPolicy,请不要犹豫,推荐它。

【问题讨论】:

  • 如果您已经成功处理并在重试 3 次后将消息移至另一个队列,您是否要删除该消息?
  • @JimXu 是的,如果处理成功,我希望将其删除,否则将其移至毒物队列,这是一种常见做法,因为我们不希望某些错误消息留在3 次尝试失败后排队。
  • 能否提供您参考的文件?
  • 根据我的研究,如果要处理队列中的消息,我们可以使用queuetrigger。更多详情请参考docs.microsoft.com/en-us/azure/azure-functions/…
  • @JimXu 感谢您的提示,我已经将 QueueTrigger 用于其他目的,但是在我提出问题的这种情况下,我需要每分钟处理一次队列,不少于一分钟。您也可以访问我提供的链接作为参考。

标签: c# azure-storage-queues


【解决方案1】:

如果 3 次失败,则将其移至 my-queue-name-poison 排队。

根据我的研究,Azure function timer tigger 没有重试行为。如果您无法在一个触发器中处理一条消息,则需要在计划中的下一次之前处理它。更多详情请参考document

我需要的是在我之后从队列中删除收集的消息 通过 cloudQueue.GetMessagesAsync(32) 获得它们;

根据我的测试,我们需要手动从队列中移除消息。定时器触发器没有办法帮助我们完成它。 所以关于需求,你需要通过你的代码来实现它。

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2016-02-22
    • 2019-03-14
    • 1970-01-01
    • 2021-06-21
    • 2019-04-18
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多