浏览或预览消息

通过消息浏览或查看,服务总线客户端可以枚举队列或订阅中的所有消息,以用于诊断和调试。

针对队列或订阅的查看操作最多返回请求数量的消息。 下表显示了 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 服务总线 功能。