訊息瀏覽 (或預覽) 可基於診斷及偵錯目的,讓服務匯流排用戶端能列舉位於佇列或訂用帳戶中的所有訊息。
佇列或訂用帳戶上的預覽操作 (Peek) 最多會傳回要求的訊息數目。 下方資料表顯示 Peek 作業所傳回的訊息類型。
| 訊息類型 | 已包含? |
|---|---|
| 使用中的訊息 | 是 |
| 死信訊息 | No |
| 已鎖定的訊息 | 是 |
| 延後的訊息 | Yes |
| 過期的訊息 | 可能會(在其被移至死信佇列之前) |
| 排定的訊息 | 「是」則列入佇列。 「否」則列入訂用帳戶 |
死信訊息
若要預覽佇列或訂用帳戶的無效信件訊息,則預覽操作應該處理與佇列或訂用帳戶相關聯的無效信件佇列。 如需詳細資訊,請參閱存取死信佇列。
過期的訊息
過期的訊息可能包含在 Peek 作業傳回的結果中。 已耗用和過期訊息會由非同步的「記憶體回收」執行進行清除。 此步驟不一定會在訊息過期之後立即發生。 這就是為什麼窺視作業可能會傳回已過期訊息的原因。 下次在佇列或訂用帳戶上叫用接收作業時,將會移除這些訊息,或將其設為死信。 當您嘗試從佇列復原已延後的訊息時,請務必記住此行為。
過期的訊息不能再以其他任何方式正常擷取,即便是由 Peek 傳回時也不例外。 傳回這些訊息是刻意設計的結果,因為 Peek 是反映目前記錄狀態的診斷工具。
已鎖定的訊息
預覽也會傳回已遭鎖定、且目前正由其他接收者處理的訊息。 然而,由於 Peek (預覽) 會傳回連線中斷的快照集,使用者無法從 Peek 訊息觀察到鎖定狀態。
延後訊息
延後訊息會和所有其他作用中的訊息一起保留在主要佇列中 (與存留於子佇列中的死信訊息不同),但您無法再使用一般的接收作業來接收訊息。 如果應用程式無法追蹤延遲的訊息,則可透過訊息瀏覽找到這些訊息。
若要檢索延遲處理的訊息,其擁有者在延遲訊息時,必須記住該序列號。 任何知道延遲訊息序號的接收者都可以使用將序號視為參數的接收方法接收訊息。 如需序號的詳細資訊,請參閱訊息排序和時間戳記。
Peek API
Peek 可用於佇列、訂用帳戶及其死信佇列。
如果重複呼叫時,Peek 操作會列舉出佇列或訂用帳戶記錄的所有訊息,並依照順序,從最小排列到最大可用序號。 這是訊息加入佇列時的順序,而非訊息最終可能被擷取的順序。
您也可以將 SequenceNumber 傳遞至窺視作業。 這個操作可用來判斷從何處開始預覽。 您可以對 Peek 操作進行後續呼叫,而不需要指定要進一步列舉的參數。
訊息數目上限
您可以指定您希望 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 範例