我有一个我想阅读的消息队列。请考虑以下代码,基于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分钟后返回队列。
答案 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条消息需要花费超过一分钟的时间,那么这些消息将再次可见(以其他方式排队),并且在下一次迭代中,您将收到相同的消息。