2016-07-15 69 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條消息需要一分多鐘,那麼這些消息會再次變爲可見(換句話說就是排隊),並在下一次迭代中返回相同的消息。