Administrar mensajes de error de Service Broker

Las aplicaciones Service Broker deben administrar dos tipos de mensajes de error recibidos de las conversaciones: los mensajes de error creados por una aplicación que utiliza Service Broker y los mensajes del sistema creados por Service Broker.

Notificar las condiciones de error de la aplicación

Las aplicaciones Service Broker son normalmente sistemas que constan de un código que se ejecuta de forma asincrónica en equipos diferentes. Las partes de la aplicación se comunican entre sí utilizando mensajes enviados en conversaciones Service Broker. La parte de la aplicación en un lado de una conversación Service Broker puede notificar los errores de la aplicación al otro lado enviando mensajes de error. La parte receptora de la aplicación debe tener el código para detectar un mensaje de error y tratar correctamente la condición de error.

Las aplicaciones Service Broker pueden comunicar los errores utilizando los tipos de mensaje definidos por el sistema o por la aplicación.

Mensajes de error definidos por el sistema

Utilice la cláusula WITH ERROR de la instrucción END CONVERSATION para notificar errores de aplicación que sean lo suficientemente graves como para requerir la finalización de la conversación. Por ejemplo:

END CONVERSATION @ConversationHandle
    WITH ERROR = 1234 DESCRIPTION = "The account specified in the invoice does not exist, verify the account number."

La instrucción END CONVERSATION WITH ERROR:

  • Genera un mensaje de error del sistema Service Broker y lo envía al lado remoto de la conversación. Los mensajes de error utilizan el tipo de mensaje de https://schemas.microsoft.com/SQL/ServiceBroker/Error definido por el sistema.

  • Finaliza el lado local de la conversación.

La parte de la aplicación que recibe el mensaje de error deberá hacer cualquier limpieza necesaria y finalizar su lado de la conversación.

Una aplicación puede finalizar en cualquier momento una conversación activa con un error. Sin embargo, si el lado remoto de la conversación ya ha finalizado la conversación, Service Broker no enviará el mensaje de error al lado remoto. En su lugar, Service Broker sólo finalizará el lado local de la conversación y quitará todos los mensajes de la conversación de la cola local.

Mensajes de error definidos por la aplicación

Puede utilizar los mensajes de error definidos por la aplicación para notificar errores que no son lo suficientemente graves para finalizar una conversación. El diseñador de la aplicación puede especificar lo siguiente:

  • Uno o más tipos de mensaje que se utilizan para comunicar estos errores de aplicación.

  • La lógica para administrar estos tipos de mensaje.

La parte de la aplicación que encuentra la condición de error puede hacer lo siguiente:

  • Realizar cualquier limpieza necesaria para el lado local de la conversación.

  • Generar un mensaje mediante el tipo de mensaje definido por la aplicación y enviarlo en la conversación.

La parte remota de la aplicación que recibe el mensaje de error debe tener el código para reconocer el mensaje de error y realizar cualquier limpieza necesaria en su lado de la conexión.

Tratar los mensajes de error

El código de aplicación que recibe los mensajes de las conversaciones de Service Broker debe tener la lógica para procesar los mensajes de error recibidos de la conversación. El código debe detectar y administrar lo siguiente:

  • Mensajes de error generados por una aplicación que utiliza un tipo de mensaje de error definido por la aplicación.

  • Mensajes de error generados por una aplicación que utiliza la cláusula WITH ERROR de la instrucción END CONVERSATION. Estos mensajes de error utilizan el tipo de mensaje de https://schemas.microsoft.com/SQL/ServiceBroker/Error y tienen un número positivo en el elemento de código.

  • Mensajes de error generados por Service Broker. Estos mensajes de error utilizan el tipo de mensaje de https://schemas.microsoft.com/SQL/ServiceBroker/Error y tienen un número negativo en el elemento de código. Service Broker crea un mensaje de error cuando un error hace imposible que Service Broker continúe la conversación. Por ejemplo, Service Broker no pueden encontrar el servicio de destino porque el servicio no existe en la instancia actual y no existe ninguna entrada para el servicio en la tabla de enrutamiento. En esta situación, Service Broker crea un mensaje de error para la conversación.

El conjunto de resultados devuelto por la instrucción RECEIVE contiene una columna message_type_name. El código que recibe normalmente los mensajes de Service Broker utiliza message_type_name para enrutar cada mensaje al código que procesa el tipo de mensaje asociado.

La lógica exacta que un programa sigue para administrar el error depende de la aplicación. Un ejemplo es un programa que utiliza la retención de mensajes y requiere transacciones de compensación cuando se produce un error en la tarea. Cuando se recibe un error, el programa consulta la cola de mensajes que ya se han procesado, realiza transacciones de compensación y, a continuación, finaliza la conversación. En cambio, si el programa sólo tiene que registrar que se ha producido un error, registra el error en una tabla de registros y finaliza la conversación.

El elemento de código del mensaje de https://schemas.microsoft.com/SQL/ServiceBroker/Error contiene el código de error. Los mensajes de error creados por una aplicación que utiliza END CONVERSATION WITH ERROR tienen un valor positivo en el código de error. Los mensajes de error generados por Service Broker contienen los valores negativos del código de error. El valor de código en los mensajes generados por Service Broker es sólo el valor negado del error que produjo el mensaje de error. Por ejemplo, cuando un error de validación XML (código de error 9615) se produce, Motor de base de datos crea un mensaje de error que tiene un elemento de código que contiene el valor -9615.

Cuando una aplicación recibe un mensaje de error, el programa ya no puede enviar los mensajes en esa conversación. La aplicación administra el error y, a continuación, finaliza su lado de la conversación. Si una aplicación recibe un tipo de mensaje de error definido por la aplicación, la conversación sigue disponible a menos que la parte remota de la aplicación también ejecute la instrucción END CONVERSATION.

Las rutinas de control de errores deben estar codificadas de manera que se eviten mensajes dudosos. Para obtener más información, vea Controlar mensajes dudosos.