Messages système Service Broker

Service Broker utilise trois types de messages système pour communiquer les informations d'état et d'erreur depuis Service Broker.

Gestion des messages système

La plupart des messages dans une conversation Service Broker sont les messages définis par l'application utilisés pour communiquer entre les services. Chaque message doit être conforme à un format de type de message qui a été défini par une instruction CREATE MESSAGE TYPE. L'ensemble de types de messages autorisé pour une conversation est défini par le contrat spécifié dans l'instruction BEGIN DIALOG CONVERSATION.

Outre les types de messages définis par l'application spécifiés dans le contrat, toute conversation peut également recevoir des messages qui utilisent l'un des trois types de messages définis par le système. Ces types de messages sont utilisés par Service Broker pour signaler des erreurs et l'état des dialogues. Chaque application doit suivre une logique de gestion des messages d'erreur (Error) et de fin de dialogue (End Dialog). Si l'application définit un minuteur de conversation sur une conversation de dialogue, elle doit contenir la logique nécessaire pour gérer les messages du minuteur de dialogue (Dialog Timer). Service Broker fournit ces types de messages pour chaque service, qu'ils soient présents ou non dans le contrat du service. Pour plus d'informations, consultez Gestion des messages d'erreur de Service Broker.

Messages d'erreur

Lorsqu'un service distant met fin à un dialogue par le biais d'une erreur ou que le broker local détecte une erreur irrécupérable dans un dialogue, un message d'erreur est créé par ce broker. Ces messages d'erreur sont du type https://schemas.microsoft.com/SQL/ServiceBroker/Error, ils sont validés en tant que contenu XML bien formé.

Le document XML contenu dans un message d'erreur utilise l'espace de noms https://schemas.microsoft.com/SQL/ServiceBroker. L'élément racine du document porte le nom local Error et englobe deux éléments : Code et Message. L'élément Code présente une valeur d'entier, tandis que l'élément Message affiche un texte du message compréhensible pour le lecteur.

Par exemple, un message d'erreur créé automatiquement par un service traitant les notes de frais peut afficher le contenu XML suivant (remis en forme pour plus de lisibilité) :

<?xml version="1.0"?>
<Error xmlns="https://schemas.microsoft.com/SQL/ServiceBroker">
  <Code>12</Code>
  <Description>
    Unknown cost center "127-1000". Please check the cost center list
    and resubmit the report.
  </Description>
</Error>

Une opération de réception reçoit un message d'erreur avant tout autre message pour ce dialogue, à moins qu'il ne s'agisse d'un message du minuteur de dialogue. L'ordre d'arrivée du message d'erreur dans la file d'attente n'est pas pris en compte. Lorsqu'une file d'attente contient à la fois un message du minuteur de dialogue et un message d'erreur, l'opération de réception récupère en priorité le message du minuteur de dialogue.

Lorsqu'un message d'erreur est arrivé pour un dialogue, le broker déclenche une erreur si une application essaie d'envoyer un message dans ce dialogue. Néanmoins, une application peut recevoir tous les messages destinés à ce dialogue s'il en reste, même après avoir reçu un message d'erreur.

Messages de fin de dialogue (End Dialog)

Lorsqu'une application met un terme à un dialogue sans spécifier d'erreur, le broker local envoie un message de fin de dialogue (End Dialog) au broker distant. Ces messages sont du type https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog.

Les messages de fin de dialogue sont des messages vides. Une opération de réception reçoit un message de ce type dans l'ordre suivant lequel il est arrivé dans la file d'attente.

Messages du minuteur de dialogue (Dialog Timer)

Les messages du minuteur de dialogue signalent la fin du décompte du minuteur de conversation pour un dialogue. Ces messages sont du type https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer. Un minuteur de conversation est spécifique à un participant de la conversation ; Service Broker n'envoie jamais les messages d'un minuteur de dialogue à l'autre participant de la conversation.

Ces messages sont vides. Une opération de réception reçoit le message du minuteur de dialogue avant tout autre message pour ce dialogue, peu importe l'ordre d'arrivée dans la file d'attente du message notifiant l'expiration du délai.