Очередь содержит 2 активных сообщения, но ReceiveBatch и Receive возвращают ноль
Я пытаюсь написать несколько модульных тестов, чтобы убедиться, что все мои операции с очередями работают должным образом, но я столкнулся со странной ситуацией:
У меня есть следующий код в моем методе [TestInitialize]:
var ns = NamespaceManager.CreateFromConnectionString(config.ServiceBusConnectionString);
var queueDescription = ns.GetQueue("happy-birthday");
Client = QueueClient.CreateFromConnectionString(config.QueueConnectionString, ReceiveMode.ReceiveAndDelete);
if (queueDescription.MessageCount > 0)
{
while (Client.Peek() != null)
{
var msg = Client.Receive();
msg.Complete();
}
}
В моей очереди есть несколько активных сообщений (подтверждено объектом queueDescription), и портал Azure подтверждает, что должно быть два активных сообщения, которые должны быть "завершены" с помощью приведенного выше кода. Однако Client.Receive() просто останавливает код на 30 секунд ожидания, а затем возвращает ноль.
Я не понимаю, почему Client.Peek() возвращает сообщение, но когда я позвонил Client.Receive(), я получил ноль.
1 ответ
Я обнаружил, что проблема была связана с моим предположением о том, что означает "отложенный".
Я предполагал, что отложенное было способом, которым я помещал в очередь то же самое сообщение назад в очередь, когда фактически отложенные сообщения отложены, и должны быть обработаны непосредственно, извлекая сообщение по порядковому номеру.
Мне удалось получить сообщение, выполнив следующие действия:
- Заглянул в сообщение
- Подтвержденное состояние == Отложено
- использовал peek-сообщение, чтобы получить SequenceNumber и получить его непосредственно из очереди
- пометить сообщение как завершенное
таким образом я смог получить пустую очередь сообщений.
NameSpace = NamespaceManager.CreateFromConnectionString(ConnectionString);
var queueInfo = NameSpace.GetQueue("happy-birthday");
Client = QueueClient.CreateFromConnectionString(connectionString, "happy-birthday");
if (queueInfo.MessageCount > 0)
{
var message = Client.Peek();
while (message != null)
{
if (message.State == MessageState.Deferred)
{
message = Client.Receive(message.SequenceNumber);
}
else
{
message = Client.Receive();
}
message.Complete();
message = Client.Peek();
}
}