VENTES: 1-800-867-1389

Procédure d'utilisation de la méthode BrokeredMessage.Defer

Mis à jour: janvier 2013

Quand vous utilisez la classe BrokeredMessage, vous avez la possibilité de laisser un message dans la file d'attente via la méthode Defer. Le message différé peut être traité plus tard, à votre discrétion. Un ajournement de message est utile pour prioritiser les messages, ou pour retarder un message qui dépend d'un autre processus. Une fois le message traité, appelez la méthode Complete pour supprimer le message de la file d'attente.

Pour utiliser la méthode Defer ou Complete, définissez le mode du client de la file d'attente sur ReceiveMode.PeekLock. Définissez le mode en appelant la méthode CreateQueueClient de la classe MessagingFactory.

Quand vous ajournez le message, ajoutez le SequenceNumber du message à une collection. Pour récupérer le message, appelez la méthode Receive de la classe QueueClient. Transmettez le numéro de séquence du message comme argument à la méthode Receive.

noteRemarque
Pour faire en sorte que le message puisse être rappelé, stockez les numéros de séquence dans un magasin durable. Sinon, si le processus échoue, vous risquez de perdre l'enregistrement des messages ajournés.

Pour mettre fin à l'ajournement, appelez la méthode Complete sur chaque message, selon le cas.

Pour un exemple d'application qui illustre la méthode Defer, consultez : Messagerie répartie : messages ajournés,

  1. Ajoutez des références aux espaces de noms suivants.

    using Microsoft.ServiceBus.Messaging;
    using Microsoft.ServiceBus;
    
    
  2. Créez une instance MessagingFactory et appelez la méthode CreateQueueClient. Pour créer MessagingFactory, récupérez l'URI de l'espace de noms Service Bus, le nom de l'émetteur (valeur par défaut : « propriétaire »), et la clé d'accès à partir du portail de gestion 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. Créez une List de type long pour stocker les nombres.

    List<long> deferredSequenceNumbers = new List<long>();
    
  2. Appelez la méthode Receive sur le client. Vérifiez chaque message pour les critères d'ajournement, et appelez la méthode Defer au besoin. Ajoutez le numéro de séquence à la collection 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. Effectuez une itération via la collection des numéros de séquence à l'aide de la méthode Receive.

    foreach (long sequenceNumber in deferredSequenceNumbers)
    {
        ProcessMessage(queueClient.Receive(sequenceNumber));
    }
    
  2. La méthode ProcessMessage appelle la méthode Complete sur chaque message.

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

Pour un exemple d'application qui illustre la méthode Defer, consultez : Messagerie répartie : messages ajournés,

Voir aussi

Cela vous a-t-il été utile ?
(1500 caractères restants)
Merci pour vos suggestions.
Afficher:
© 2014 Microsoft