Partager via


Regroupement de messages mis en file d'attente dans une session

Windows Communication Foundation (WCF) fournit une session qui vous permet de regrouper un ensemble de messages connexes à traiter par une application de réception unique. Les messages qui font partie d'une session doivent faire partie de la même transaction. Étant donné que tous les messages font partie de la même transaction, si un message n'est pas traité, la session entière est restaurée. Les sessions ont des comportements semblables en ce qui concerne les files d'attente de lettres mortes et les files d'attente de messages incohérents. La propriété Durée de vie (Time to Live ou TTL) définie sur une liaison mise en file d'attente configurée pour les sessions est appliquée à la session dans son ensemble. Si seulement quelques-uns des messages de la session sont envoyés avant l'expiration de la durée de vie, la session entière est placée dans la file d'attente de lettres mortes. De même, lorsque les messages d'une session ne parviennent pas à être envoyés à une application depuis la file d'attente de l'application, la session entière est placée dans la file d'attente de messages incohérents (si disponible).

Exemple de regroupement de messages

Le regroupement de messages peut être utile lors de l'implémentation d'une application de traitement de commandes en tant que service WCF. Par exemple, un client soumet à cette application une commande qui contient plusieurs éléments. Pour chaque élément, le client passe un appel au service, ce qui provoque l'envoi d'un message séparé. Il est possible que le serveur A reçoive le premier élément et que le serveur B reçoive le deuxième élément. Chaque fois qu'un élément est ajouté, le serveur qui traite cet élément doit rechercher la commande appropriée et lui ajouter l'élément, ce qui est peu efficace. Vous rencontrez également de telles inefficacités avec un seul serveur gérant toutes les demandes, parce que le serveur doit faire le suivi de toutes les commandes en cours de traitement et déterminer à quelle commande le nouvel élément appartient. Le regroupement de toutes les demandes pour une commande unique simplifie grandement l'implémentation d'une telle application. L'application cliente envoie tous les éléments d'une commande unique dans une session, donc lorsque le service traite la commande, il traite la session entière en une fois. \

Procédures

Pour paramétrer un contrat de service pour qu'il utilise des sessions

  1. Définissez un contrat de service qui requiert une session. Faites ceci avec l'attribut OperationContractAttribute et en spécifiant :

    SessionMode=SessionMode.Required
    
  2. Marquez les opérations du contrat comme étant unidirectionnelles, parce que ces méthodes ne retournent rien. Faites ceci avec l'attribut OperationContractAttribute et en spécifiant :

    [OperationContract(IsOneWay = true)]
    
  3. Implémentez le contrat de service et spécifiez un InstanceContextMode de PerSession. Cela instancie le service une seule fois pour chaque session.

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
    
  4. Chaque opération de service requiert une transaction. Spécifiez ceci avec l'attribut OperationBehaviorAttribute. L'opération qui complète la transaction doit également affecter à TransactionAutoComplete la valeur true.

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
    
  5. Configurez un point de terminaison qui utilise la liaison NetProfileMsmqBinding fournie par le système.

  6. Créez une file d'attente transactionnelle en utilisant System.Messaging. Vous pouvez également créer la file d'attente en utilisant Message Queuing (MSMQ) ou MMC. Dans ce cas, créez une file d'attente transactionnelle.

  7. Créez un hôte de service pour le service en utilisant ServiceHost.

  8. Ouvrez l'hôte de service pour rendre le service disponible.

  9. Fermez l'hôte de service.

Pour installer un client

  1. Créez une étendue de transaction pour écrire dans la file d'attente transactionnelle.

  2. Créez le client WCF à l'aide de l'outil ServiceModel Metadata Utility Tool (Svcutil.exe).

  3. Passez la commande.

  4. Fermez le client WCF.

Exemple

Description

L'exemple suivant fournit le code pour le service IProcessOrder et pour un client qui utilise ce service. Il montre comment WCF utilise des sessions mises en file d'attente pour fournir le comportement de regroupement.

Code du service

Code du client

Voir aussi

Concepts

Vue d'ensemble des files d'attente

Autres ressources

Sessions and Queues Sample