Очередь содержит 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 ответ

Решение

Я обнаружил, что проблема была связана с моим предположением о том, что означает "отложенный".

Я предполагал, что отложенное было способом, которым я помещал в очередь то же самое сообщение назад в очередь, когда фактически отложенные сообщения отложены, и должны быть обработаны непосредственно, извлекая сообщение по порядковому номеру.

Мне удалось получить сообщение, выполнив следующие действия:

  1. Заглянул в сообщение
  2. Подтвержденное состояние == Отложено
  3. использовал peek-сообщение, чтобы получить SequenceNumber и получить его непосредственно из очереди
  4. пометить сообщение как завершенное

таким образом я смог получить пустую очередь сообщений.

   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();
        }
    }
Другие вопросы по тегам