VERTRIEB: 1-800-867-1380

Verwendung der BrokeredMessage.Defer-Methode

Letzte Aktualisierung: Februar 2015

Bei Verwendung der BrokeredMessage-Klasse haben Sie die Möglichkeit, eine Nachricht mithilfe der Defer-Methode in der Warteschlange zu lassen. Die verzögerte Nachricht kann später nach Ihrem Ermessen verarbeitet werden. Eine Nachrichtenverzögerung ist zur Priorisierung von Nachrichten und zum Zurückstellen einer Nachricht, die von einem anderen Prozess abhängt, sinnvoll. Rufen Sie nach der Verarbeitung der Nachricht, die Complete-Methode auf, um die Nachricht aus der Warteschlange zu löschen.

Zur Verwendung der Defer- oder Complete-Methode legen Sie den Modus des Warteschlangenclients auf ReceiveMode.PeekLock fest. Legen Sie den Modus fest, indem Sie die CreateQueueClient-Methode der MessagingFactory-Klasse aufrufen.

Wenn Sie die Nachricht verzögern, fügen Sie die Sequenznummer der Nachricht zu einer Auflistung hinzu. Zum Empfangen der Nachricht rufen Sie die Receive-Methode der QueueClient-Klasse auf. Übergeben Sie die Sequenznummer der Nachricht als Argument an die Receive-Methode.

noteHinweis
Speichern Sie die Sequenznummern an einem dauerhaften Speicherort, um sicherzustellen, dass die Nachricht zurückgerufen werden kann. Anderfalls wird der Datensatz der verzögerten Nachrichten verloren gehen, wenn beim Prozess ein Fehler auftritt.

Zur Beendigung der Verzögerung rufen Sie die Complete-Methode nach Bedarf für jede Nachricht auf.

Eine Beispielanwendung, die die Defer-Methode veranschaulicht, können Sie hier finden: Brokermessaging: Verzögerte Nachrichten.

  1. Fügen Sie Verweise auf folgende Namespaces hinzu.

    using Microsoft.ServiceBus.Messaging;
    using Microsoft.ServiceBus;
    
    
  2. Erstellen Sie eine MessagingFactory-Instanz und rufen Sie die CreateQueueClient-Methode auf. Um das "MessagingFactory"-Objekt zu erstellen, rufen den Service Bus-Namespace-URI, den SAS-Schlüsselnamen (Shared Access Signature) (Standardwert: "RootManageSharedAccessKey") und den SAS-Schlüssel selbst aus dem Azure-Verwaltungsportal ab.

    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. Erstellen Sie eine generische Liste des Typs Long, um die Nummern zu speichern.

    List<long> deferredSequenceNumbers = new List<long>();
    
  2. Rufen Sie die Receive-Methode auf dem Client auf. Überprüfen Sie die Verzögerungskriterien für jede Nachricht und rufen Sie bei Bedarf die Defer-Methode auf. Fügen Sie die Sequenznummer zur Listenauflistung hinzu.

    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. Iterieren Sie unter Verwendung der Receive-Methode durch die Auflistung der Sequenznummern.

    foreach (long sequenceNumber in deferredSequenceNumbers)
    {
        ProcessMessage(queueClient.Receive(sequenceNumber));
    }
    
  2. Die ProcessMessage-Methode ruft die Complete-Methode für jede Nachricht auf.

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

Eine Beispielanwendung, die die Defer-Methode veranschaulicht, können Sie hier finden: Brokermessaging: Verzögerte Nachrichten.

Siehe auch

Fanden Sie dies hilfreich?
(1500 verbleibende Zeichen)
Vielen Dank für Ihr Feedback.
Anzeigen:
© 2015 Microsoft