.net - 并非所有消息都从 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");
解决方案
Peek 操作无法检索您指定的确切计数可能有两个原因:
一个原因是消息集合的聚合大小超过了 256 KB 的最大大小。另一个原因是,如果队列或主题的 EnablePartitioning 属性设置为 true,则分区可能没有足够的消息来完成请求的消息数量。
所以一般我会建议你Peek
重复使用操作,可能使用循环。假设您在执行时收到了 236 条消息中的 136 条PeekAsync(236)
。在这种情况下,您必须记下实际收到的计数并调用PeekAsync(236 - returned count)
,它的参数带有减去的值。returned count
每次得到结果时都应该增加。
您正在使用的客户端对象会记住上次查看的序列号,然后继续检索下一组消息。这样您就可以检索所有消息。
推荐阅读
- java - Vertx 多线程 Verticle 实例和工作池大小
- r - 如何根据另一列中的 TRUE/FALSE 获得一列的总和
- eclipse - 我应该在 CMake 中选择哪个生成器来在 Windows、Amazon FreeRTOS 和 ESP32 上使用 Eclipse 进行编程
- c# - 如何将处理程序添加到内部 NLog 异常?
- javascript - 如何在 Django 中使用 openCV 访问客户端摄像头进行人脸识别?
- python - 从数据框中选择随机值,以便生成的数据框在 python-pandas 的两列中是唯一的
- pointers - 将 *[]foo 类型的变量转换为 *[]bar
- java - py4j - 在多处理中使用 java 成员对象
- javascript - 谷歌云函数错误 - 发布订阅到 BigQuery
- javascript - 承诺然后回调上下文“this.callFunc() 不是函数”