Esplorare o visualizzare in anteprima i messaggi

L'esplorazione (o visualizzazione in anteprima) dei messaggi consente a un client di bus di servizio di enumerare tutti i messaggi presenti in una coda o in una sottoscrizione a scopo diagnostico o di debug.

L'operazione Peek eseguita su una coda o una sottoscrizione restituisce al massimo il numero di messaggi richiesto. Nella tabella seguente sono riportati i tipi di messaggi restituiti dall'operazione Peek.

Tipo di messaggi Incluso
Messaggi attivi Sì
Messaggi non recapitabili No
Messaggi bloccati Sì
Messaggi rinviati Sì
Messaggi scaduti Potrebbero essere (prima che vengano spostati nella coda dei messaggi non recapitabili)
Messaggi pianificati Sì alle code. No per le sottoscrizioni

Messaggi non recapitabili

Per visualizzare in anteprima i messaggi non recapitabili di una coda o di una sottoscrizione, l'operazione peek deve essere eseguita nella coda dei messaggi non recapitabili associata alla coda o alla sottoscrizione. Per altre informazioni, vedere Accesso alle code di messaggi non recapitabili.

Messaggi scaduti

I messaggi scaduti potrebbero essere inclusi nei risultati restituiti dall'operazione Peek. I messaggi consumati e scaduti vengono puliti da un'esecuzione asincrona di "Garbage Collection". Questo passaggio potrebbe non verificarsi necessariamente subito dopo la scadenza dei messaggi. Ecco perché un'operazione peek potrebbe restituire messaggi che sono già scaduti. Questi messaggi verranno rimossi o spostati nella coda dei messaggi non recapitabili quando successivamente viene richiamata un'operazione di ricezione nella coda o nella sottoscrizione. Tenere presente questo comportamento quando si tenta di recuperare i messaggi rinviati dalla coda.

Un messaggio scaduto non è più idoneo per il recupero normale con qualsiasi altra modalità, anche se viene restituito dal metodo Peek. La restituzione di questi messaggi è previsto da progettazione, dato che il metodo Peek è uno strumento di diagnostica che visualizza lo stato attuale del log.

Messaggi bloccati

Il metodo Peek restituisce anche i messaggi in stato di blocco attualmente elaborati da altri ricevitori. Tuttavia, poiché l'operazione Peek restituisce uno snapshot disconnesso, lo stato di blocco di un messaggio non può essere osservato nei messaggi ottenuti con Peek.

Messaggi rinviati

I messaggi rinviati rimangono nella coda principale insieme a tutti gli altri messaggi attivi (a differenza dei messaggi non recapitabili che rimangono in una coda secondaria), ma non possono essere più ricevuti usando le normali funzioni di ricezione. I messaggi rinviati possono essere individuati tramite l'esplorazione dei messaggi se un'applicazione ne perde traccia.

Per recuperare un messaggio rinviato, il proprietario deve ricordarsi il numero di sequenza perché è quello che rinvia il messaggio. Qualsiasi ricevitore che conosce il numero di sequenza di un messaggio rinviato può ricevere successivamente il messaggio usando metodi di ricezione che accettano il numero di sequenza come parametro. Per altre informazioni sui numeri di sequenza, vedere Sequenziazione dei messaggi e timestamp.

API Peek

Il metodo Peek funziona nelle code, nelle sottoscrizioni e nelle rispettive code di messaggi non recapitabili.

Quando viene chiamata ripetutamente, l'operazione peek enumera tutti i messaggi nella coda o nella sottoscrizione, in ordine, dal numero di sequenza disponibile più basso al più alto. Si tratta dell'ordine in cui i messaggi sono stati accodati e non dell'ordine in cui i messaggi potrebbero essere recuperati.

È anche possibile passare un oggetto SequenceNumber a un'operazione peek. Viene usato per determinare da dove iniziare a sbirciare. È possibile effettuare chiamate successive all'operazione di visualizzazione in anteprima senza specificare il parametro, per continuare l'enumerazione.

Numero massimo di messaggi

È possibile specificare il numero massimo di messaggi che devono essere restituiti dall'operazione peek. Tuttavia, non è possibile garantire una dimensione minima per il batch. Il numero di messaggi restituiti dipende da diversi fattori, di cui il più impattante è la velocità con cui la rete può trasmettere messaggi al client.

Ecco un frammento di codice di esempio per esaminare tutti i messaggi con .NET SDK. È possibile utilizzare SequenceNumber​ per tenere traccia dell'ultimo messaggio visualizzato in anteprima e iniziare a esaminare il messaggio successivo.

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);
}

L'output di esempio seguente proviene dalla visualizzazione in anteprima di una coda contenente 13 messaggi.

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

Prova gli esempi nel linguaggio preferito per esplorare le funzionalità di bus di servizio di Azure.