É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. Lorsque cela se produit, le service de composants mis en file d’attente COM+ permet à une classe d’exception d’être associée à un composant. Pour associer la classe d’exception au composant, utilisez l’onglet Advanced dans la page des propriétés du composant de l’outil d’administration des services de composants. Vous pouvez également associer la classe d’exception par programmation à l’aide de l’attribut du composant catalogue ExceptionClass des fonctions d’administration COM+.
La classe d’exception est définie en tant que ProgID ou CLSID d’un composant implémentant IPlaybackControl. Le service 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 et irrécupérable.
Outre 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. Lorsque IPlaybackControl ::FinalClientRetry est appelé, le temps d’exécution des composants mis en file d’attente renvoie le message défaillant 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é. Si, toutefois, le gestionnaire d’exceptions abandonne le message en retournant un état d’échec à partir de l’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 place le message dans la file d’attente de lettres mortes Xact.
- L’écouteur de file d’attente de lettres mortes (DLQL) recherche un message dans la file d’attente de lettres mortes Xact.
- DLQL récupère le CLSID du composant cible à partir du message et recherche une classe d’exception.
- DLQL instancie la classe d’exception.
- Les requêtes DLQL pour IPlaybackControl pour la classe d’exception.
- DLQL appelle la méthode IPlaybackControl ::FinalClientRetry dans la classe d’exception.
- Le DLQL lit tous les appels de propriété et de méthode du message à la classe d’exception.
- DLQL supprime le message si le gestionnaire d’exceptions termine la transaction correctement. Le gestionnaire d’exceptions peut émettre IObjectContext ::SetAbort, et le message reste dans la file d’attente de lettres mortes.
Si l’une des étapes précédentes échoue, le message est laissé 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. Après un passage dans la file d’attente, il 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 dernière file d’attente de repos, utilisez l’utilitaire de déplacement de message. Pour plus d’informations sur l’utilitaire de déplacement de messages, consultez Gestion des erreurs.
Rubriques connexes