VENDAS: 1-800-867-1389

Como utilizar o método BrokeredMessage.Defer

Atualizado: janeiro de 2013

Ao utilizar a classe BrokeredMessage, há a opção de deixar uma mensagem na fila utilizando o método Defer. A mensagem adiada pode ser processada mais tarde, a seu critério. O adiamento de mensagem é útil para priorizar mensagens ou para adiar uma mensagem que depende de algum outro processo. Após processar a mensagem, chame o método Complete para excluir a mensagem da fila.

Para utilizar o método Defer ou Complete, defina o modo de fila do cliente como ReceiveMode.PeekLock. Defina o modo ao chamar o método CreateQueueClient da classe MessagingFactory.

Ao adiar a mensagem, adicione o SequenceNumber da mensagem a uma coleção. Para recuperar a mensagem, chame o método Receive da classe QueueClient. Passe o número de sequência da mensagem como um argumento para o método Receive.

noteObservação
Para garantir que a mensagem possa ser chamada novamente, armazene os números de sequência em um repositório durável. Caso contrário, se houver falha no processo, o registro das mensagens adiadas será perdido.

Para finalizar o adiamento, chame o método Complete para cada mensagem, conforme necessário.

Para obter um aplicativo de amostra que demonstra o método Defer, consulte: Sistema de Mensagens Agenciado: Mensagens adiadas,

  1. Adicionar referências para os namespaces a seguir.

    using Microsoft.ServiceBus.Messaging;
    using Microsoft.ServiceBus;
    
    
  2. Crie uma instâcia MessagingFactory, e chame CreateQueueClient como método. Para criar o MessagingFactory, recupere o URI de namespace do barramento de serviço, o nome do emissor (padrão: "proprietário"), e a chave de acesso do portal de gerenciamento Azure.

    private static QueueClient CreateQueueClient(string queueName) 
    {
        // The serviceBusNamespace and serviceBusIssuerKey return the values specific to an Azure account. 
        string serviceBusIssuerKey = "yourServiceBusIssuerKey";
        string serviceBusNamespace = "yourServiceBusNamespace";
        string serviceBusIssuerName = "owner" ' The default is 'owner'.
        Uri runtimeUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceBusNamespace, string.Empty);
        MessagingFactory messagingFactory = MessagingFactory.Create(runtimeUri, 
            TokenProvider.CreateSharedSecretTokenProvider(serviceBusIssuerName, serviceBusIssuerKey));
        return messagingFactory.CreateQueueClient(queueName,ReceiveMode.PeekLock); 
    } 
    
    

  1. Crie uma Lista genérica de tipo longo para armazenar os números.

    List<long> deferredSequenceNumbers = new List<long>();
    
  2. Chame o método Receive no cliente. Verifique os critérios de atraso em cada mensagem e chame o método Defer, conforme necessário. Adicione o número de sequência à coleção Lista.

    BrokeredMessage receivedMessage = queueClient.Receive(TimeSpan.FromSeconds(10));
        if (receivedMessage == null)
        {
            break;
        }
        else
        {
            // Low-priority messages will be dealt with later:
            if (receivedMessage.Properties["Priority"].ToString() == "Low")
            {
               receivedMessage.Defer();
               Console.WriteLine("Deferred message with id {0}.", receivedMessage.MessageId);
               // Deferred messages can only be retrieved by message receipt. Here, keeping track of the
               // message receipt for a later retrieval: 
               deferredSequenceNumbers.Add(receivedMessage.SequenceNumber);
         }
         else
         {
               ProcessMessage(receivedMessage);
         }
      
    
    
    Dim receivedMessage As BrokeredMessage = myQueueC.Receive(TimeSpan.FromSeconds(10))
    If receivedMessage Is Nothing Then
        Resume
     Else
     
        ' Low-priority messages will be dealt with later:
        If receivedMessage.Properties("Priority").ToString() = "Low" Then
     
         receivedMessage.Defer()
         Console.WriteLine("Deferred message with id {0}.", receivedMessage.MessageId)
         ' Deferred messages can only be retrieved by message receipt. Here, keeping track of the
         '  message receipt for a later retrieval: 
         deferredSequenceNumbers.Add(receivedMessage.SequenceNumber)
        Else
            ProcessMessage(receivedMessage)
        End If
     End If
    
    

  1. Itere pela coleção de números de sequência utilizando o método Receive.

    foreach (long sequenceNumber in deferredSequenceNumbers)
    {
        ProcessMessage(queueClient.Receive(sequenceNumber));
    }
    
  2. O método ProcessMessage chama o método Complete em cada mensagem.

    private static void ProcessMessage(BrokeredMessage message)
    {
        // To do: code to process the message.
        message.Complete();
    }
    
    

Para obter um aplicativo de amostra que demonstra o método Defer, consulte: Sistema de Mensagens Agenciado: Mensagens adiadas,

Consulte também

Isso foi útil para você?
(1500 caracteres restantes)
Agradecemos os seus comentários
Mostrar:
© 2014 Microsoft