メッセージを参照またはプレビューする

Service Bus クライアントは、メッセージ参照、つまりピークを行うことにより、診断とデバッグの目的で、キューまたはサブスクリプション内のすべてのメッセージを列挙できます。

キューまたはサブスクリプションに対するPeek 操作では、多くてもメッセージの要求された数しか返されません。 次の表に、Peek 操作によって返されるメッセージの種類を示します。

メッセージの種類 含まれていますか?
アクティブ メッセージ はい
デッドレター メッセージ いいえ
ロックされたメッセージ はい
遅延メッセージ はい
期限切れのメッセージ (デッドレターになる前の)可能性があります
予約メッセージ キューの場合は[はい] サブスクリプション: いいえ

配信不能メッセージ

キューまたはサブスクリプションのデッドレター メッセージを表示するには、そのキューまたはサブスクリプションに関連付けられているデッドレター キューで表示操作を実行する必要があります。 詳細については、配信不能キューへのアクセスに関する記事を参照してください。

期限切れのメッセージ

Peek 操作から返される結果に、期限切れのメッセージが含まれることがあります。 消費され、有効期限の切れたメッセージは、非同期 "ガベージ コレクション" を実行することによって消去されます。 この手順は、メッセージの有効期限が切れた後にただちに実行されるとは限りません。 そのため、peek操作により、有効期限が既に切れているメッセージが返される可能性があります。 これらのメッセージは、次回キューまたはサブスクリプションで受信操作が呼び出されたときに削除されるか、またはデッドレター キューに移動されます。 キューから保留メッセージを回復しようとする場合、この動作に留意してください。

期限切れのメッセージは、Peek によって返された場合でも、他のいかなる手段でも通常の取得の対象ではなくなります。 ピークはログの現在の状態を反映する診断ツールであるため、これらのメッセージが返されるのは設計によるものです。

ロックされたメッセージ

Peek によって、他のレシーバーが現在処理しているロックされたメッセージも返されます。 ただし、Peek では切断されたスナップショットが返されるため、メッセージのロック状態は Peek したメッセージでは確認できません。

保留メッセージ

遅延メッセージは、他のすべてのアクティブなメッセージと共にメイン キューに留まります (サブキューに含まれる配達不能メッセージとは異なります)。ただし、通常の受信操作を使用してこれらを受信することはできなくなります。 アプリケーションが保留メッセージを追跡できなくなった場合、メッセージ参照を使用して検出できます。

保留されたメッセージを取得するには、その所有者がそれを保留するときにシーケンス番号を記憶する必要があります。 遅延メッセージのシーケンス番号を知っている受信者は、シーケンス番号をパラメーターとして受け取る受信メソッドを使用して、後でメッセージを受信できます。 シーケンス番号の詳細については、「メッセージのシーケンス処理とタイムスタンプ」を参照してください。

Peek APIs

Peek は、キュー、サブスクリプション、およびそれらの配信不能キューに対して使用できます。

繰り返し呼び出されると、peek 操作は、キューまたはサブスクリプション内のすべてのメッセージを、使用可能なシーケンス番号が最小のものから最大のものまで順番に列挙します。 これは、メッセージがエンキューされた順序であり、メッセージが最終的に取得される可能性のある順序ではありません。

また、SequenceNumber を peek 操作に渡すこともできます。 これは、どこから覗き始めるかを特定するために使用します。 このパラメーターを指定せずに、peek 操作への後続の呼び出しを行い、さらに列挙することができます。

メッセージの最大数

peek 操作で返されるメッセージの最大数を指定できます。 ただし、バッチの最小サイズを保証する方法はありません。 返されるメッセージの数は、複数の要因によって決まりますが、その中で最も影響が大きいのは、ネットワークがクライアントにメッセージをストリーミングできる速度です。

.NET SDK を使用してすべてのメッセージを参照するスニペットの例を次に示します。 SequenceNumber​ を使って、最後に peek したメッセージを記録し、次のメッセージから参照を開始できます。

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 Service Bus の機能については、使用する言語のサンプルを試してみてください。