Esporta (0) Stampa
Espandi tutto

Come usare il metodo BrokeredMessage.Defer

Aggiornamento: febbraio 2015

Quando si usa la classe BrokeredMessage, è possibile lasciare un messaggio nella coda usando il metodo Defer. Il messaggio rinviato può essere elaborato in un secondo momento, a seconda delle preferenze. Il rinvio di messaggi è utile per classificare in ordine di priorità i messaggi o per ritardare un messaggio che dipende da un altro processo. Dopo l'elaborazione del messaggio, chiamare il metodo Complete per eliminare il messaggio dalla coda.

Per usare il metodo Defer o Complete, impostare la modalità del client di coda su ReceiveMode.PeekLock. Per impostare la modalità, chiamare il metodo CreateQueueClient della classe MessagingFactory.

Quando si rinvia un messaggio, aggiungere l'oggetto SequenceNumber del messaggio a una raccolta. Per recuperare li messaggio, chiamare il metodo Receive della classe QueueClient. Passare il numero di sequenza del messaggio come argomento del metodo Receive.

noteNota
Per assicurarsi che il messaggio possa essere richiamato, archiviare i numeri di sequenza in un archivio permanente. In caso contrario, se si verifica un errore del processo, il record dei messaggi rinviati andrà perso.

Per terminare il rinvio, chiamare il metodo Complete su ogni messaggio, in base alle esigenze.

Per un'app di esempio che illustra il metodo Defer, vedere: Messaggistica negoziata: messaggi rinviati,

  1. Aggiungere i riferimenti agli spazi dei nomi seguenti.

    using Microsoft.ServiceBus.Messaging;
    using Microsoft.ServiceBus;
    
    
  2. Creare un'istanza di MessagingFactory e chiamare il metodo CreateQueueClient. Per creare l'oggetto MessagingFactory, recuperare l'URI dello spazio dei nomi del bus di servizio, il nome della chiave di firma di accesso condiviso (nome predefinito: "RootManageSharedAccessKey") e la chiave di firma di accesso condiviso dal portale di gestione di Azure.

    private static QueueClient CreateQueueClient(string queueName) 
    {
        // The serviceBusNamespace and serviceBusSASKey return the values specific to an Azure account. 
        string serviceBusSASKey = "yourServiceBusSASKey";
        string serviceBusNamespace = "yourServiceBusNamespace";
        string serviceBusKeyName = "RootManageSharedAccessKey";
        Uri runtimeUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceBusNamespace, string.Empty);
        MessagingFactory messagingFactory = MessagingFactory.Create(runtimeUri, 
            TokenProvider.CreateSharedAccessSignatureTokenProvider(serviceBusKeyName, serviceBusSASKey));
        return messagingFactory.CreateQueueClient(queueName,ReceiveMode.PeekLock); 
    } 
    
    

  1. Creare un oggetto List generico di tipo long per archiviare i numeri.

    List<long> deferredSequenceNumbers = new List<long>();
    
  2. Chiamare il metodo Receive nel client. Verificare la presenza di criteri di rinvio per ogni messaggio e chiamare il metodo Defer in base alle esigenze. Aggiungere il numero di sequenza alla raccolta List.

    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. Eseguire l'iterazione nella raccolta di numeri di sequenza usando il metodo Receive.

    foreach (long sequenceNumber in deferredSequenceNumbers)
    {
        ProcessMessage(queueClient.Receive(sequenceNumber));
    }
    
  2. Il metodo ProcessMessage chiama il metodo Complete su ogni messaggio.

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

Per un'app di esempio che illustra il metodo Defer, vedere: Messaggistica negoziata: messaggi rinviati,

Vedere anche

Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
Mostra:
© 2015 Microsoft