Поделиться через


Обработка сообщений об ошибках компонента Service Broker

Приложения компонента Service Broker должны обрабатывать два типа сообщений об ошибках, получаемых из диалогов: сообщения об ошибках. созданные приложением. которое использует компонент Service Broker, и системные ошибки, созданные компонентом Service Broker.

Сообщение об ошибках в приложении

Приложениями Service Broker обычно являются системы, образованные кодом, асинхронно выполняющимся на различных компьютерах. Компоненты приложения связываются между собой с помощью сообщений, отправляемых в рамках диалогов компонента Service Broker. Компонент приложения на одной из сторон диалога компонента Service Broker может извещать об ошибках в приложении другую сторону, отправляя сообщения об ошибке. Принимающий компонент приложения должен содержать код, который обнаруживает сообщение об ошибке и корректно обрабатывает ошибочную ситуацию.

Приложения компонента Service Broker могут передавать данные об ошибках в типах сообщений, определяемых системой или определяемых приложением.

Сообщения об ошибках, определяемые системой

С помощью предложения WITH ERROR в инструкции END CONVERSATION следует сообщать о серьезных ошибках в приложении, в результате которых необходимо завершение диалога. Например,

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

Инструкция END CONVERSATION WITH ERROR:

  • Создает системное сообщение об ошибке компонента Service Broker и отправляет его на удаленную сторону диалога. В сообщениях об ошибке используется тип сообщений https://schemas.microsoft.com/SQL/ServiceBroker/Error, определяемый системой.

  • Завершает локальную сторону диалога.

Компонент приложения, который получает сообщение Error, должен выполнить необходимую очистку и завершить свою сторону диалога.

Приложение в любой момент может завершить активный диалог с ошибкой. Однако если удаленная сторона диалога уже завершила диалог, то компонент Service Broker не будет отправлять сообщение об ошибке на удаленную сторону. Вместо этого компонент Service Broker просто завершает локальную сторону диалога и удаляет из локальной очереди все сообщения для этого диалога.

Сообщения об ошибках, определяемые приложением

С помощью сообщений об ошибках, определяемых приложением, можно передавать данные о менее серьезных ошибках, которые не приводят к прекращению диалога. Конструктор приложения может указать следующие атрибуты сообщения:

  • один или несколько типов сообщений, используемых для передачи данных об этих ошибках в приложении;

  • логику для обработки этих типов сообщений.

Компонент приложения, в котором обнаруживается ошибка, может выполнить следующие действия:

  • запросить необходимую очистку на локальной стороне диалога;

  • построить сообщение с помощью типа сообщений, определяемого приложением, и отправить его в рамках диалога.

Удаленный компонент приложения, получающий сообщение об ошибке, должен содержать код, который распознает сообщение об ошибке и выполняет необходимые операции очистки на своей стороне соединения.

Обработка сообщений об ошибке

Код приложения, получающий сообщения из диалогов компонента Service Broker, должен содержать логику для обработки сообщений об ошибке, получаемых из диалога. Этот код должен обнаруживать и обрабатывать следующие типы сообщений.

  • Сообщения об ошибке, созданные приложением, которое использует тип сообщений об ошибке, определяемый приложением.

  • Сообщения об ошибке, созданные приложением, которое использует предложение WITH ERROR инструкции END CONVERSATION. Такие сообщения об ошибке используют тип сообщений https://schemas.microsoft.com/SQL/ServiceBroker/Error и содержат положительное число в элементе Code.

  • Сообщения об ошибке, созданные компонентом Service Broker. Эти сообщения об ошибке используют тип сообщений https://schemas.microsoft.com/SQL/ServiceBroker/Error и содержат отрицательное число в элементе Code. Компонент Service Broker создает сообщение Error, если в результате ошибки компоненту Service Broker не удается продолжить диалог. Например, компоненту Service Broker не удается найти целевую службу, поскольку она не существует в текущем экземпляре и для нее отсутствует запись в таблице маршрутизации. В этом случае компонент Service Broker создает для диалога сообщение Error.

Результирующий набор, возвращаемый инструкцией RECEIVE, содержит столбец message_type_name. В коде, получающем сообщения компонента Service Broker, столбец message_type_name обычно используется для маршрутизации каждого сообщения к коду, который обрабатывает связанный с сообщением тип.

Реализация логики обработки ошибок в программе зависит от приложения. Примером служит программа, в которой используется хранение сообщений и необходимы компенсирующие транзакции, если задача завершается ошибкой. Когда получена ошибка, программа запрашивает в очереди сообщения, которые уже были обработаны, выполняет компенсирующие транзакции, а затем завершает диалог. Напротив, если программе необходимо только зафиксировать факт ошибки, то она заносит ошибку в таблицу журнала и завершает диалог.

Элемент Code сообщения https://schemas.microsoft.com/SQL/ServiceBroker/Error содержит тип ошибки. Сообщения Error, созданные приложением, которое использует инструкцию END CONVERSATION WITH ERROR, имеют положительное значение кода ошибки. Сообщения Error, созданные компонентом Service Broker, содержат отрицательные значения кода ошибки. Значение Code в сообщениях, созданных компонентом Service Broker, получается в результате отрицания значения ошибки, вызвавшей сообщение Error. Например, если происходит ошибка проверки XML (код ошибки 9615) то компонент Database Engine создает сообщение Error, в котором элемент Code содержит значение -9615.

После того как приложение получило сообщение Error, программа больше не может отправлять сообщение в этот диалог. Приложение обрабатывает ошибку, а затем завершает свою сторону диалога. Если приложение получает тип сообщения об ошибке, определяемый приложением, то диалог будет по-прежнему доступным, если удаленный компонент приложения еще не выполнил инструкцию END CONVERSATION.

Код подпрограмм обработки ошибок должен предотвращать опасные сообщения. Дополнительные сведения см. в разделе Обработка сообщений о сбое.