获取、处理和删除所有队列消息,而不是逐个执行

本文关键字:执行 消息 队列 处理 删除 获取 | 更新日期: 2023-09-27 18:27:12

我正在处理Azure队列。我需要获取、处理和删除所有队列消息。我现在正在做的是逐个调用GetMessage、处理消息和调用DeleteMessage。

var message = _queue.GetMessage();
if (message == null)
{
     return;
}
// processs
 _queue.DeleteMessage(message); 

有没有办法先获取所有消息,然后处理并删除所有这些处理过的消息?

获取、处理和删除所有队列消息,而不是逐个执行

您不能在一次调用中从队列中获取所有消息。CCD_ 1。所以你需要做的是:

var messages = _queue.GetMessages(32);

然后处理这些消息,而不是一次得到一条消息。

更新

因此,根据你的评论,有几件事:

  • 队列有一个名为ApproximateMessages的属性,它将告诉您队列中大约有多少条消息。这应该会让您了解消息的总数
  • 你不能一次删除32条信息。您需要一次删除一条消息

基于这些,请查看下面的伪代码:

            do
            {
                var messages = _queue.GetMessages(32);
                foreach (var msg in messages)
                {
                    ProcessMessage(msg);
                    DeleteMessage(msg);
                }
                var approximateMessagesCount = _queue.FetchAttributes().ApproximateMessageCount.Value;
                if (approximateMessagesCount == 0)
                {
                    break;
                }
            } while (true);

基本上,你必须继续从队列中提取消息(一次32条),处理单个消息,一旦消息被处理,就将其删除。一旦这32条消息被处理和删除,你就必须检查队列中是否还有其他消息。如果有消息,您将重复此过程。如果没有消息,那么您将退出循环。