2016-07-15 5 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). Таким образом, в зависимости от того, сколько времени вы потратите на выполнение строки кода PendingOrders.Add(singleOrder);, вполне возможно, что вы получите те же самые сообщения. Если для пересылки более 32 сообщений требуется больше минуты, эти сообщения снова становятся видимыми (в других местах). На следующей итерации вы получите те же сообщения.