Gérer les messages d’erreur Service Broker

S’applique à :SQL ServerAzure SQL Managed Instance

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.

Signaler les conditions d’erreur de l’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 WITH ERROR clause de l’instruction END CONVERSATION pour signaler les erreurs d’application qui sont suffisamment graves pour exiger la fin 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 Error message doit effectuer tout nettoyage nécessaire 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à terminé la conversation, Service Broker n’envoie pas le message d’erreur côté distant. 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 des messages d’erreur définis par l’application pour signaler des erreurs qui ne sont pas suffisamment graves pour mettre fin à 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.

Gérer les 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 ;

  • Messages d’erreur générés par une application qui utilise la WITH ERROR clause de l’instruction END CONVERSATION . Ces messages d’erreur utilisent le type de https://schemas.microsoft.com/SQL/ServiceBroker/Error message et ont un nombre positif dans l’élément Code .

  • 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 ont un nombre négatif dans l’élément du code. Service Broker crée un message d’erreur lorsqu’une erreur rend impossible la poursuite de la conversation par Service Broker. Par exemple, Service Broker ne peut pas localiser le service de destination, car le service n’existe pas dans l’instance actuelle et il n’y a pas d’entrée pour le service dans la table de routage. Dans ce cas, Service Broker crée un Error message pour la conversation.

Le jeu de résultats retourné par l’instruction RECEIVE contient une message_type_name colonne. Le code qui reçoit des messages Service Broker utilise message_type_name généralement pour acheminer 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 Code du https://schemas.microsoft.com/SQL/ServiceBroker/Error message contient le code d’erreur. Error les messages créés par une application qui utilisent END CONVERSATION WITH ERROR ont une valeur positive pour le code d’erreur. Error les messages générés par Service Broker contiennent des valeurs négatives pour le code d’erreur. La Code valeur dans les messages générés par Service Broker est simplement la valeur négation de l’erreur qui a provoqué le Error message. Par exemple, lorsqu’une erreur de validation XML (code d’erreur 9615) se produit, le moteur de base de données crée un Error message contenant une Code valeur -9615.

Une fois qu’une application reçoit un Error message, 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 est toujours disponible, sauf si la partie distante de l’application a également été exécutée 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 Gérer les messages incohérents.