mensajes del sistema de Broker

Service Broker usa tres tipos de mensaje del sistema para comunicar el estado y la información de error de Service Broker.

Controlar mensajes del sistema

La mayoría de los mensajes de una conversación de Service Broker son los mensajes definidos por la aplicación para comunicarse entre servicios. Cada mensaje debe seguir un formato de tipo de mensaje definido por una instrucción CREATE MESSAGE TYPE. El contrato especificado en la instrucción BEGIN DIALOG CONVERSATION define el conjunto de tipos de mensaje permitidos para una conversación.

Además de los tipos de mensaje definidos por la aplicación que se especifican en el contrato, cualquier conversación puede recibir también mensajes que usan uno de los tres tipos de mensaje definidos por el sistema. Service Broker usa estos tipos de mensaje para notificar errores y el estado de los diálogos. Cada aplicación debe contener lógica para controlar mensajes de error y de fin de diálogo. Si la aplicación establece un temporizador de conversación en una conversación de diálogo, la aplicación debe contener la lógica para controlar los mensajes del temporizador de diálogos. Service Broker proporciona estos tipos de mensaje a cada servicio, si aparecen o no en el contrato para el servicio. Para obtener más información, vea Administrar mensajes de error de Service Broker.

Mensajes de error

Cuando un servicio remoto finaliza un diálogo con un error o el broker local detecta un error imposible de recuperar en un diálogo, el broker local crea un mensaje de error. Estos mensajes son mensajes de tipo https://schemas.microsoft.com/SQL/ServiceBroker/Error. Los mensajes de error se validan como XML correcto.

El documento XML incluido en un mensaje de error usa el espacio de nombres https://schemas.microsoft.com/SQL/ServiceBroker. El elemento raíz del documento tiene el nombre local Error y contiene un elemento denominado Code y un elemento denominado Message. El elemento Code contiene un valor entero. El elemento Message contiene el texto legible del mensaje.

Por ejemplo, un mensaje de error generado por un servicio que procesa informes de gastos puede contener el siguiente XML (con formato modificado para facilitar la lectura):

<?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>

Una operación de recepción recibe un mensaje de error antes que cualquier mensaje para dicho diálogo distinto de un mensaje de temporizador de diálogos. Esto se produce sin tener en cuenta el orden en el que el mensaje de error llegó a la cola. Cuando una cola incluye un mensaje de temporizador de diálogo y un mensaje de error, una operación de recepción recibe el mensaje de temporizador de diálogo antes que el mensaje de error.

Cuando un mensaje de error llega a un diálogo, el broker genera un error si una aplicación intenta enviar un mensaje en ese diálogo. Sin embargo, una aplicación puede recibir cualquier mensaje restante para el diálogo, incluso después de haber recibido un mensaje de error.

Cuando una aplicación finaliza un diálogo sin especificar un error, el broker local envía un mensaje de fin de diálogo al broker remoto. Los mensajes de fin de diálogo son mensajes de tipo https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog.

Los mensajes de fin de diálogo son mensajes vacíos. Una operación de recepción recibe un mensaje de fin de diálogo en el orden en que el mensaje ha llegado a la cola.

Los mensajes de temporizador de diálogo indican que el temporizador de conversación de un diálogo ha caducado. Estos mensajes son mensajes de tipo https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer. Los temporizadores de conversación son específicos de un extremo de la conversación; Service Broker nunca envía un mensaje de temporizador de diálogo al otro extremo de la conversación.

Los mensajes de temporizador de diálogo son mensajes vacíos. Una operación de recepción recibe el mensaje de temporizador de diálogo antes que cualquier otro mensaje para ese diálogo, independientemente del orden en que el mensaje de tiempo de espera ha llegado a la cola.