Очередь Azure, выбрасывающая исключение в DeleteMessage - PullRequest
2 голосов
/ 06 апреля 2011

Я работаю над проектом на основе Azure для некоторых исследований и столкнулся с некоторыми проблемами при удалении сообщений из экземпляра CloudQueue. Код довольно прост, поэтому я немного озадачен тем, почему возникает исключение, когда я пытаюсь удалить сообщение из очереди.

Вот код, который создает данные для очереди:

foreach (var cell in scheme(cells))
{
    string id = Guid.NewGuid().ToString();
    var blob = sweepItemContainer.GetBlobReference(id);
    using (BlobStream stream = blob.OpenWrite())
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(stream, cell);
    }
    sweepItemQueue.AddMessage(new CloudQueueMessage(id), new TimeSpan(1, 0, 0));
}

Вот код, который потребляет данные из очереди:

var msgs = sweepItemsQueue.GetMessages(MsgAmt);
foreach (var msg in msgs)
{
     _handleMessage(msg, sweepItemsContainer);
     sweepItemsQueue.DeleteMessage(msg);
     mergeItemsQueue.AddMessage(new CloudQueueMessage(msg.AsString), new TimeSpan(1, 0, 0));
}

Я не вижу, как сообщение не может существовать в очереди. Ничто другое не мутирует в очереди, кроме других потребителей. Но я уверен, что они не могут получить одно и то же сообщение (если время не истекло), так как же это происходит?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Есть два тайм-аута, о которых вам нужно беспокоиться: как долго сообщение живет в очереди (которое вы указали при вызове .AddMessage(), и время ожидания видимости, которое устанавливается при вызове .GetMessages() ( по умолчанию это 30 секунд, перегрузка , которая позволяет вам указать время ожидания.) При вызове .GetMessages() все возвращаемые сообщения становятся невидимыми для других потребителей в течение периода 'visibilityTimeout'. Как только это period завершает все сообщения, которые вы еще не удалили, становятся видимыми для всех других потребителей.

Чтобы проверить, является ли это проблемой, я бы попытался использовать перегрузку .GetMessages() с максимальным тайм-аутом видимости 2 часа. Если это проблема, вы можете отрегулировать это значение до более разумного числа. Другой вариант - просто получать одно сообщение за раз.

1 голос
/ 29 мая 2012

Еще один ответ от Стива Маркса, в основном посмотрите на исключение хранилища и двигайтесь дальше.Я видел это и в других рамках: Сообщение в блоге Стива Маркса

 try
 {
    q.DeleteMessage(msg);
 }
 catch (StorageClientException ex)
 {
 if (ex.ExtendedErrorInformation.ErrorCode == "MessageNotFound")
 {
     // pop receipt must be invalid
     // ignore or log (so we can tune the visibility timeout)
 }
 else
 {
    // not the error we were expecting
     throw;
 }
}
...