Как получить количество мертвых писем в очереди?
Вопрос
Как получить длину очереди недоставленных писем без получения каждого сообщения и подсчета количества полученных сообщений?
Моя текущая реализация
public int GetDeadLetterQueueCount()
{
//Ref:http://stackru.com/questions/22681954/how-do-you-access-the-dead-letter-sub-queue-on-an-azure-subscription
MessagingFactory factory = MessagingFactory.CreateFromConnectionString(CloudConnectionString);
QueueClient deadLetterClient = factory.CreateQueueClient(QueueClient.FormatDeadLetterPath(_QueueClient.Path), ReceiveMode.PeekLock);
BrokeredMessage receivedDeadLetterMessage;
List<string> lstDeadLetterQueue = new List<string>();
// Ref: https://code.msdn.microsoft.com/Brokered-Messaging-Dead-22536dd8/sourcecode?fileId=123792&pathId=497121593
// Log the dead-lettered messages that could not be processed:
while ((receivedDeadLetterMessage = deadLetterClient.Receive(TimeSpan.FromSeconds(10))) != null)
{
lstDeadLetterQueue.Add(String.Format("DeadLettering Reason is \"{0}\" and Deadlettering error description is \"{1}\"",
receivedDeadLetterMessage.Properties["DeadLetterReason"],
receivedDeadLetterMessage.Properties["DeadLetterErrorDescription"]));
var locktime = receivedDeadLetterMessage.LockedUntilUtc;
}
return lstDeadLetterQueue.Count;
}
Проблема с реализацией
Поскольку я получаю каждое сообщение в режиме просмотра и блокировки, для сообщений установлена длительность блокировки. В течение этого времени я не могу получать или даже видеть сообщения снова, пока не истечет этот период времени.
Должен быть более простой способ просто получить счет без опроса очереди?
Я не хочу потреблять сообщения, я просто хотел бы подсчитать общую сумму.
1 ответ
Решение
Вы можете использовать метод Ge tQueue () NamespaceManager, который имеет свойство MessageCountDetails, которое, в свою очередь, имеет свойство DeadLetterMessageCount. Что-то вроде:
var namespaceManager = Microsoft.ServiceBus.NamespaceManager.CreateFromConnectionString("<CONN_STRING>");
var messageDetails = namespaceManager.GetQueue("<QUEUE_NAME>").MessageCountDetails;
var deadLetterCount = messageDetails.DeadLetterMessageCount;