队列包含 2 个活动消息,但 ReceiveBatch 和 Receive return null

Queue contains 2 Active Messages, But ReceiveBatch and Receive return null

我正在尝试编写一些单元测试来验证我的所有队列操作是否按预期工作,但我 运行 遇到了最奇怪的情况:

我的 [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 门户确认应该有两个活动消息,上面的代码应该是 "completed"。但是,Client.Receive() 只是将代码暂停 30 秒等待,然后 returns 为空。

我不明白为什么 Client.Peek() returns 消息,但是当我调用 Client.Receive() 时,我返回了一个空值。

我确定问题是由于我对 "Deferred" 含义的假设。

我假设延迟是我 en-queued 将相同消息放回队列的方式,而实际上延迟消息被搁置,必须通过按序列号检索消息直接处理。

我能够按照以下步骤检索邮件:

  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();
        }
    }