Gestion des messages d'erreur de Service Broker
Les applications Service Broker doivent gérer deux types de messages d'erreur reçus des conversations : les messages d'erreur créés par une application qui utilise Service Broker et les messages système créés par Service Broker.
Signalisation de conditions d'erreur d'application
En règle générale, les applications Service Broker sont des systèmes comprenant du code exécuté de manière asynchrone sur différents ordinateurs. Les différentes parties de l'application communiquent entre elles par le biais de messages envoyés sur des conversations Service Broker. La partie de l'application d'un côté d'une conversation Service Broker peut signaler les erreurs d'application à l'autre côté en envoyant des messages d'erreur. La partie réceptrice de l'application doit comporter du code pour détecter un message d'erreur et gérer correctement la condition d'erreur.
Les applications Service Broker peuvent signaler les erreurs au moyen de types de messages définis par le système ou définis par l'application.
Messages d'erreur définis par le système
Utilisez la clause WITH ERROR de l'instruction END CONVERSATION afin de signaler les erreurs d'application qui sont suffisamment graves pour imposer l'arrêt de la conversation. Par exemple :
END CONVERSATION @ConversationHandle
WITH ERROR = 1234 DESCRIPTION = "The account specified in the invoice does not exist, verify the account number."
L'instruction END CONVERSATION WITH ERROR :
génère un message d'erreur système Service Broker et l'envoie au côté distant de la conversation. Les messages d'erreur utilisent le type de message https://schemas.microsoft.com/SQL/ServiceBroker/Error défini par le système ;
met fin à la partie locale de la conversation.
La partie de l'application qui reçoit le message d'erreur doit effectuer les opérations de nettoyage nécessaires et mettre fin à son côté de la conversation.
Une application peut à tout moment mettre fin à une conversation active par le biais d'un message d'erreur. Toutefois, si le côté distant de la conversation a déjà mis fin à la conversation, Service Broker ne lui envoie pas le message d'erreur. Service Broker met simplement fin à la partie locale de la conversation et supprime de la file d'attente locale tous les messages de la conversation.
Messages d'erreur définis par l'application
Vous pouvez utiliser les messages d'erreur définis par l'application afin de signaler les erreurs qui ne sont pas suffisamment graves pour imposer l'arrêt d'une conversation. Le concepteur de l'application peut spécifier les éléments suivants :
un ou plusieurs types de messages utilisés pour signaler ces erreurs d'application ;
la logique de gestion de ces types de messages.
La partie de l'application qui rencontre la condition d'erreur peut effectuer les opérations suivantes :
procéder aux opérations de nettoyage requises pour la partie locale de la conversation ;
générer un message à l'aide du type de message défini par l'application et l'envoyer sur la conversation.
La partie distante de l'application qui reçoit le message d'erreur doit comporter du code pour reconnaître le message d'erreur et effectuer les opérations de nettoyage requises sur son côté de la connexion.
Gestion des messages d'erreur
Le code d'application qui reçoit des messages de conversations Service Broker doit inclure la logique nécessaire pour traiter les messages d'erreur reçus de la conversation. Le code doit détecter et gérer les éléments suivants :
les messages d'erreur générés par une application qui utilise un type de message d'erreur défini par l'application ;
les messages d'erreur générés par une application qui utilise la clause WITH ERROR de l'instruction END CONVERSATION. Ces messages d'erreur utilisent le type de message https://schemas.microsoft.com/SQL/ServiceBroker/Error et comportent un nombre positif dans l'élément de code ;
les messages d'erreur générés par Service Broker. Ces messages d'erreur utilisent le type de message https://schemas.microsoft.com/SQL/ServiceBroker/Error et comportent un nombre négatif dans l'élément de code. Service Broker crée un message d'erreur lorsqu'une erreur entraîne l'incapacité de Service Broker à poursuivre la conversation. Par exemple, Service Broker ne peut pas identifier le service de destination car le service n'existe pas dans l'instance actuelle et aucune entrée pour le service n'est présente dans la table de routage. Dans cette situation, Service Broker crée un message d'erreur pour la conversation.
Le jeu de résultats retourné par l'instruction RECEIVE contient une colonne message_type_name. Le code qui reçoit les messages Service Broker utilise généralement message_type_name pour router chaque message vers du code qui traite le type de message associé.
La logique exacte que suit un programme pour gérer l'erreur dépend de l'application. Il peut s'agir, par exemple, d'un programme qui utilise la rétention des messages et qui requiert des transactions de compensation lorsque la tâche échoue. Lorsqu'une erreur est reçue, le programme interroge la file d'attente pour déterminer les messages qui ont déjà été traités, procède à des transactions de compensation, puis met fin à la conversation. Par opposition, si le programme doit uniquement signaler qu'une erreur s'est produite, il consigne l'erreur dans une table de journalisation et met fin à la conversation.
L'élément de code du message https://schemas.microsoft.com/SQL/ServiceBroker/Error contient le code d'erreur. Les messages d'erreur créés par une application qui utilise END CONVERSATION WITH ERROR comportent une valeur positive pour le code d'erreur. Les messages d'erreur générés par Service Broker contiennent des valeurs négatives pour le code d'erreur. La valeur de code dans les messages générés par Service Broker est simplement la valeur négative de l'erreur qui a provoqué le message d'erreur. Par exemple, lorsqu'une erreur de validation XML (code d'erreur 9615) se produit, le Moteur de base de données crée un message d'erreur qui possède un élément de code contenant la valeur -9615.
Une fois qu'une application a reçu un message d'erreur, le programme ne peut plus envoyer de messages sur cette conversation. L'application gère l'erreur puis met fin à son côté de la conversation. Si une application reçoit un type de message d'erreur défini par l'application, la conversation reste disponible, à moins que la partie distante de l'application ait également exécuté END CONVERSATION.
Les routines de gestion des erreurs doivent être codées de façon à empêcher les messages incohérents. Pour plus d'informations, consultez Gestion des messages incohérents.