Я пытаюсь получить 32 сообщения на запрос из очереди Azure.
queue.ApproximateMessageCount;
Этот код дает мне результат 1509. Сообщает мне, что соединение в порядке и есть записи. Также проверяю в очереди, у нее действительно 1509 записей. Но когда я пытаюсь получить записи, я не получаю никаких записей. Я делаю следующее:
var messages = await queue.GetMessagesAsync(configuration.MessageBatchSize);
if (!messages.Any()) {
return;
}
Он всегда входит в if и возвращается. Что здесь происходит и что мне не хватает?
если сообщения удаляются из очереди, чем все удалось? Счетчик не должен показывать 1509, верно?
Не правда. Сообщения, удаленные из очереди, все еще находятся в очереди, поэтому их количество включено в приблизительное количество сообщений. Только когда сообщение удалено, оно исчезло.
для получения сообщений в пакетном режиме необходимо настроить очередь (для EnableBatchedOperations установлено значение true)
Сделайте это, получая сообщения в пакетном режиме, я использую такой код:
var messages = await queueClient?.ReceiveBatchAsync(Max_Messages);
foreach (var message in messages)
{
await dispatcher.Dispatch(message); // do something with each message
}
Но для получения сообщений с помощью ReceiveBatchAsync очередь должна быть настроена с флагом EnableBatchedOperations в значение true.
Свойство ApproximateMessageCount
представляет общее количество сообщений, доступных в очереди в данный момент. Это не означает, что все сообщения (максимум # 32 сообщения в запросе) готовы к удалению из очереди. Вы можете использовать это свойство, чтобы определить, сколько сообщений находится в очереди.
queue.ApproximateMessageCount;
Если вы не смогли получить сообщение с помощью GetMessagesAsync(numberOfMessages)
, то будет сказано, что все сообщения недоступны или невидимы для текущего QueueClient.
var cloudQueueMessages = await cloudQueue.GetMessagesAsync(numberOfMessages);
Вы можете попробовать опросить очередь через некоторое время, чтобы увидеть, возвращаются ли сообщения на поверхность.
Обратите внимание, что рекомендуется установить адекватный тайм-аут видимости для любого сообщения, удаляемого из очереди, чтобы избежать неопределенного голода :)
Возможно ли, что все сообщения в вашей очереди удалены из очереди?