2016-07-15 39 views
0

我有一个我想阅读的消息队列。考虑下面的代码的基础上,100个项目队列:Azure“偷看”整个队列?

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; 
      } 

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

回答

0

当您拨打queue.GetMessages时,您实际上是在您的队列上执行Dequeue操作。 GetMessages操作实际上使消息在1分钟的时间内不可见。

但是,消息不会从队列中删除。因此,当您拨打queue.FetchAttributes()(其中填充ApproximateMessageCount队列的属性将始终返回相同的数字(100))。因此,根据您在执行代码所花费的时间多少,完全有可能得到相同的消息。如果循环32条消息需要一分多钟,那么这些消息会再次变为可见(换句话说就是排队),并在下一次迭代中返回相同的消息。