Azure“窥视”整个队列?

时间:2016-07-15 22:52:54

标签: azure azure-queues

我有一个我想阅读的消息队列。请考虑以下代码,基于100个项目的队列:

queue.FetchAttributes();
            var orderCount = queue.ApproximateMessageCount;
            while(orderCount > 0)
            {
                var messages = queue.GetMessages(32,TimeSpan.FromMinutes(1));
                if (messages != null)
                {
                    foreach (var item in messages)
                    {
                        Order singleOrder = new JavaScriptSerializer().Deserialize<Order>(item.AsString);
                        PendingOrders.Add(singleOrder);
                    }
                }
                queue.FetchAttributes();
                orderCount = (messages == null) ? 0 : queue.ApproximateMessageCount;
            }

在这种情况下,将对“queue.GetMessages()”进行3次调用以检索96条消息,然后进行第4次调用以获取剩余的4条。然后循环将退出并返回项目列表。 当我运行它时,它似乎一遍又一遍地提升相同的物品,即不增加。当我读到一个项目时,我的印象是它暂时从队列中删除了吗?因此,每次我阅读一条消息时,它都会暂时从我的队列中删除 - 在这种情况下持续1分钟。我错过了一步吗? 注意,我没有在任何地方调用'DeQueue',因为我希望该项目在1分钟后返回队列。

1 个答案:

答案 0 :(得分:0)

当您致电queue.GetMessages时,您实际上正在对您的队列执行Dequeue操作。 GetMessages操作实际上使得获取的消息在1分钟内不可见。

但是,消息不会从队列中删除。因此,当您调用填充queue.FetchAttributes()队列ApproximateMessageCount属性的https://github.com/iVantage/angular-ivh-treeview#expanded-by-default时,将始终返回相同的数字(100)。因此,根据您执行PendingOrders.Add(singleOrder);代码行所花费的时间,您完全可能会收到相同的消息。如果循环超过32条消息需要花费超过一分钟的时间,那么这些消息将再次可见(以其他方式排队),并且在下一次迭代中,您将收到相同的消息。