Échecs de Client-Side persistants
Dans certains cas, Message Queuing peut déplacer un message vers la file d’attente de destination. Par exemple, si les contrôles d’accès à la file d’attente n’autorisent pas le déplacement du message du client vers le serveur, le message incriminé est déplacé vers la file d’attente de lettres mortes côté client. Dans ce cas, le service de composants en file d’attente COM+ permet d’associer une classe d’exception à un composant. Pour associer la classe d’exception au composant, utilisez l’onglet Avancé de la page propriétés du composant de l’outil d’administration Services de composants. Vous pouvez également associer la classe d’exception par programmation à l’aide de l’attribut de composant de catalogue ExceptionClass des fonctions d’administration COM+.
La classe d’exception est définie comme le ProgID ou le CLSID d’un composant implémentant IPlaybackControl. Le service de composants mis en file d’attente dispose d’un moniteur de file d’attente de lettres mortes qui analyse la file d’attente de lettres mortes Xact. S’il existe un message dans la file d’attente, le moniteur de file d’attente de lettres mortes instancie le gestionnaire d’exceptions associé au composant cible et appelle IPlaybackControl::FinalClientRetry, indiquant qu’il y a eu une erreur côté client irrécupérable.
En plus d’IPlaybackControl, le gestionnaire d’exceptions doit implémenter le même ensemble d’interfaces que le composant serveur pour lequel il gère les exceptions. Quand IPlaybackControl::FinalClientRetry est appelé, l’exécution des composants mis en file d’attente lit le message d’échec au gestionnaire d’exceptions. Cela permet au gestionnaire d’exceptions d’implémenter un autre comportement pour les messages qui ne peuvent pas être déplacés vers le serveur, par exemple, en générant une transaction de compensation.
Si le gestionnaire d’exceptions termine tous les appels de méthode lus, le message est supprimé de la file d’attente de lettres mortes Xact et est ignoré. Toutefois, si le gestionnaire d’exceptions abandonne le message en retournant un status d’échec à partir d’un des appels de méthode, le message est retourné à la file d’attente de lettres mortes Xact. La séquence d’événements suivante montre comment les exceptions côté client sont gérées :
- Message Queuing ne parvient pas à remettre un message au serveur et le place dans la file d’attente de lettres mortes Xact.
- L’écouteur de file d’attente de lettres mortes (DLQL) trouve un message dans la file d’attente de lettres mortes Xact.
- Le DLQL récupère le CLSID du composant cible à partir du message et recherche une classe d’exception.
- Le DLQL instancie la classe d’exception.
- Requêtes DLQL pour IPlaybackControl pour la classe d’exception.
- Le DLQL appelle la méthode IPlaybackControl::FinalClientRetry dans la classe exception.
- Le DLQL lit tous les appels de propriété et de méthode du message à la classe exception.
- Le DLQL supprime le message si le gestionnaire d’exceptions termine la transaction avec succès. Le gestionnaire d’exceptions peut émettre IObjectContext::SetAbort, et le message restera dans la file d’attente de lettres mortes.
Si l’une des étapes précédentes échoue, le message reste dans la file d’attente de lettres mortes Xact.
Au démarrage, le DLQL lit chaque message dans la file d’attente de lettres mortes transactionnelles Message Queuing et instancie la classe d’exception pour chaque message de composants mis en file d’attente. Une fois la file d’attente passée, elle attend les nouveaux messages. Il traite ensuite chaque nouveau message de file d’attente de lettres mortes à mesure qu’il arrive.
Si vous devez intervenir dans le processus décrit ici ou si vous devez déplacer un message incohérent hors de sa file d’attente de repos finale, utilisez l’utilitaire de déplacement de messages. Pour plus d’informations sur l’utilitaire de déplacement de messages, consultez Gestion des erreurs.
Rubriques connexes