Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
通过消息浏览或查看,服务总线客户端可以枚举队列或订阅中的所有消息,以用于诊断和调试。
针对队列或订阅的查看操作最多返回请求数量的消息。 下表显示了 Peek 操作返回的消息类型。
| 消息类型 | 是否包括? |
|---|---|
| 活跃消息 | 是 |
| 死信消息 | 否 |
| 锁定消息 | 是 |
| 延迟消息 | 是 |
| 过期消息 | 可能会(在它们成为死信消息之前) |
| 定时消息 | 对于队列,答案是是。 订阅不适用 |
死信消息
若要查看队列或订阅的死信消息,应针对与队列或订阅关联的死信队列运行查看操作。 有关详细信息,请参阅访问死信队列。
过期消息
过期消息可能包含在从 Peek 操作返回的结果中。 已消费的消息和过期的消息通过异步“垃圾回收”过程进行清理。 此步骤未必会在消息过期后立即执行。 这就是为何查看操作可能会返回已过期的消息。 下一次对队列或订阅调用接收操作时,这些消息将被删除或设为死信。 请在尝试从队列中恢复延期消息时谨记此行为。
过期的消息无法再通过其他任何方式进行常规检索,即使是通过 Peek 返回时,也不例外。 返回这些消息是设计使然,因为 Peek 是反映日志当前状态的诊断工具。
锁定消息
Peek 操作还会返回已锁定且当前由其他接收程序处理的消息。 但是,因为 Peek 返回的是分离的快照,所以无法在 Peek 的消息上观察到消息的锁状态。
延迟消息
延后的消息连同其他所有活动消息保留在主队列中(与保留在子队列中的死信消息不同),但无法再通过常规接收操作接收它们。 如果应用程序不再能跟踪延迟的消息,可以通过消息浏览来发现这些消息。
若要检索延迟的消息,消息所有者在延迟它时需负责记住序列号。 任何接收方,只要知道延迟消息序列号,之后都可以通过使用将序列号作为参数的接收方法来接收消息。 有关序列号的详细信息,请参阅消息排序和时间戳。
Peek APIs
查看适用于队列、订阅及其死信队列。
如果重复调用,窥视操作会按顺序(从最低可用序号到最高可用序号)枚举队列或订阅中的所有消息。 这是消息的入队顺序,并不是消息最终可能被检索的顺序。
还可以将 SequenceNumber 传递到窥视操作。 它用于确定从何处开始预览。 可以在不指定该参数的情况下,对 peek 操作进行后续调用以继续枚举。
消息的最大数目
可指定希望速览操作返回的最大消息数。 但是,无法保证批的最小大小。 返回的消息数由几个因素决定,其中影响最大的因素是网络将消息流式传输到客户端的速度。
下面是使用 .NET SDK 查看所有消息的示例代码片段。
SequenceNumber 可用于跟踪上次预览的消息,并开始在下一条消息处浏览。
using Azure.Messaging.ServiceBus;
// Create a Service Bus client for your namespace
ServiceBusClient client = new ServiceBusClient("NAMESPACECONNECTIONSTRING");
// Create Service Bus receiver for your queue in the namespace
ServiceBusReceiver receiver = client.CreateReceiver("QUEUENAME");
// Peek operation with max count set to 5
var peekedMessages = await receiver.PeekMessagesAsync(maxMessages: 5);
// Keep receiving while there are messages in the queue
while (peekedMessages.Count > 0)
{
int counter = 0; // To get the sequence number of the last peeked message
int countPeekedMessages = peekedMessages.Count;
if (countPeekedMessages > 0)
{
// For each peeked message, print the message body
foreach (ServiceBusReceivedMessage msg in peekedMessages)
{
Console.WriteLine(msg.Body);
counter++;
}
Console.WriteLine("Peek round complete");
Console.WriteLine("");
}
// Start receiving from the message after the last one
var fromSeqNum = peekedMessages[counter-1].SequenceNumber + 1;
peekedMessages = await receiver.PeekMessagesAsync(maxMessages: 5, fromSequenceNumber: fromSeqNum);
}
以下示例输出来自于查看包含 13 条消息的队列。
Message 1
Message 2
Message 3
Message 4
Message 5
Peek round complete
Message 6
Message 7
Message 8
Message 9
Message 10
Peek round complete
Message 11
Message 12
Message 13
Peek round complete
相关内容
尝试所选语言的示例,了解 Azure 服务总线 功能。
- 适用于 .NET(最新)的 Azure 服务总线客户端库示例 --“发送和接收消息”示例。
- 适用于 Java(最新)的 Azure 服务总线客户端库示例 - “速览消息”示例
- 适用于 Python 的 Azure 服务总线客户端库示例 - “receive_peek.py”示例
- 适用于 JavaScript 的 Azure 服务总线客户端库示例 - “browseMessages.js”示例
- 适用于 TypeScript 的 Azure 服务总线客户端库示例 - “browseMessages.ts”示例