Navegar ou pré-visualizar mensagens

A navegação por mensagens, ou espreitar, permite que um cliente do Service Bus enumere todas as mensagens numa fila ou subscrição, para fins de diagnóstico e depuração.

A operação Peek numa fila ou numa assinatura devolve, no máximo, o número solicitado de mensagens. A tabela a seguir mostra os tipos de mensagens retornadas pela operação Peek.

Tipo de mensagens Incluído?
Mensagens ativas Sim
Mensagens em fila de mensagens mortas Não
Mensagens bloqueadas Sim
Mensagens adiadas Sim
Mensagens expiradas Pode ser (antes de serem enviadas para a fila de mensagens mortas)
Mensagens agendadas Sim para filas de espera. Sem subscrições

Mensagens em fila de mensagens mortas

Para visualizar mensagens em fila de mensagens mortas de uma fila ou assinatura, a operação de visualização deve ser executada na fila de mensagens mortas associada à fila ou assinatura. Para obter mais informações, consulte aceder a filas de mensagens mortas.

Mensagens expiradas

Mensagens expiradas podem ser incluídas nos resultados retornados da operação Peek. As mensagens consumidas e expiradas são limpas por uma execução assíncrona de "coleta de lixo". Esta etapa pode não ocorrer necessariamente imediatamente após as mensagens expirarem. É por isso que uma operação de visualização pode retornar mensagens que já expiraram. Essas mensagens serão removidas ou movidas para a fila de mensagens mortas quando uma operação de recebimento for invocada na fila ou na assinatura da próxima vez. Tenha esse comportamento em mente ao tentar recuperar mensagens adiadas da fila.

Uma mensagem expirada já não é elegível para recuperação regular por qualquer outro meio, mesmo quando é devolvida pelo Peek. O retorno dessas mensagens é por design, pois o Peek é uma ferramenta de diagnóstico que reflete o estado atual do log.

Mensagens bloqueadas

O Peek também retorna mensagens que foram bloqueadas e estão a ser processadas por outros recetores. No entanto, como Peek retorna um instantâneo dissociado, o estado de bloqueio de uma mensagem não pode ser observado em mensagens obtidas com Peek.

Mensagens adiadas

As mensagens adiadas permanecem na fila principal junto com todas as outras mensagens ativas (ao contrário das mensagens de letra morta que vivem numa subfila), mas já não podem ser recebidas através das operações regulares de receção. Mensagens adiadas podem ser descobertas por meio da navegação de mensagens se uma aplicação perder o controlo delas.

Para recuperar uma mensagem adiada, o respetivo proprietário é responsável por se lembrar do número de sequência ao adiá-la. Qualquer recetor que conheça o número de sequência de uma mensagem adiada pode posteriormente receber a mensagem usando métodos de receção que aceitam o número de sequência como parâmetro. Para obter mais informações sobre números de sequência, consulte Sequenciamento de mensagens e carimbos de data/hora.

APIs Peek

O Peek funciona com filas, assinaturas e suas filas de mensagens mortas.

Quando chamada repetidamente, a operação de peek enumera todas as mensagens na fila ou subscrição, por ordem, do número de sequência disponível mais baixo ao mais alto. É a ordem em que as mensagens foram enfileiradas, não a ordem na qual as mensagens podem eventualmente ser recuperadas.

Pode também passar um SequenceNumber para uma operação de peek. É usado para determinar por onde começar a espreitar. Você pode fazer chamadas subsequentes para a operação peek sem especificar o parâmetro, para continuar a enumeração.

Número máximo de mensagens

Você pode especificar o número máximo de mensagens que deseja que a operação de visualização retorne. Mas, não há como garantir um tamanho mínimo para o lote. O número de mensagens retornadas depende de vários fatores, dos quais o mais impactante é a rapidez com que a rede pode transmitir mensagens para o cliente.

Aqui está um trecho de exemplo para espiar todas as mensagens com o SDK do .NET. O SequenceNumber​ pode ser usado para acompanhar a última mensagem pré-visualizada e começar a navegação a partir da mensagem seguinte.

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

A saída de exemplo a seguir é o resultado de inspecionar uma fila com 13 mensagens.

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

Experimente os exemplos no idioma da sua escolha para explorar os recursos do Azure Service Bus.