首页 > 解决方案 > 并非所有消息都从 Azure 服务总线队列中窥视

问题描述

我有一个 Azure 服务总线队列,死信子队列中有 236 条消息。我知道这一点是因为 Azure 门户和服务总线资源管理器向我显示了该数字。

我在 LINQPad 中编写了以下代码来检索所有 236 条消息并检查它们。然而,它只返回 236 条消息中的 136 条。

我正在使用 Microsoft.Azure.ServiceBus nuget 包的 v5.1.0。

关于为什么我没有收到所有 236 条消息的任何想法?

const string queueName = "the-queue-name";
const string serviceBusConnectionString = "Endpoint=...";

var receiver = new MessageReceiver(serviceBusConnectionString, EntityNameHelper.FormatDeadLetterPath(queueName));
var receivedMessages = await receiver.PeekAsync(300);

Console.WriteLine($"Received [{receivedMessages.Count()}] dead-letters");

标签: .netazureazure-servicebus-queues

解决方案


Peek 操作无法检索您指定的确切计数可能有两个原因:

一个原因是消息集合的聚合大小超过了 256 KB 的最大大小。另一个原因是,如果队列或主题的 EnablePartitioning 属性设置为 true,则分区可能没有足够的消息来完成请求的消息数量。

所以一般我会建议你Peek重复使用操作,可能使用循环。假设您在执行时收到了 236 条消息中的 136 条PeekAsync(236)。在这种情况下,您必须记下实际收到的计数并调用PeekAsync(236 - returned count),它的参数带有减去的值。returned count每次得到结果时都应该增加。

您正在使用的客户端对象会记住上次查看的序列号,然后继续检索下一组消息。这样您就可以检索所有消息。


推荐阅读