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


Получение уведомлений

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

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

SQL Server трассирует подписки на уведомления при помощи сочетания идентификатора уведомления и реального переданного запроса. Если приложение запрашивает уведомления для двух разных запросов, используя один и тот же идентификатор уведомления, то SQL Server создает две подписки с одним и тем же идентификатором уведомления. Однако если приложение дважды запрашивает уведомления для одного и того же запроса с одним и тем же идентификатором уведомления, то SQL Server создает одну подписку со временем ожидания, указанным во втором запросе.

Приложения, выполняющиеся в базе данных, обычно являются хранимыми процедурами, запускаемыми в очереди при прибытии сообщения. Эти хранимые процедуры могут быть написаны либо на Transact-SQL, либо на одном из языков .NET. Менее типичные подходы включают в себя запуск приложения как задачи по расписанию или использование стартового задания для постоянной работы хранимой процедуры в фоновом режиме.

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

  • Приложение может периодически опрашивать запрос на предмет прибытия сообщения.

  • Приложение может использовать предложение WAITFOR инструкции RECEIVE для блокировки выполнения пакета или хранимой процедуры во время выполнения инструкции RECEIVE до тех пор, пока инструкция не возвратит как минимум одну строку.

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

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

Из-за того, что в окнах уведомления о запросах всегда содержится одно сообщение уведомления, обрабатывающее уведомления о запросах, приложение должно заканчивать диалог после приема сообщения. В противном случае в диалоге произойдет тайм-аут. При истечении времени ожидания окна уведомления о запросе SQL Server протоколирует ошибку времени ожидания окна в журнале ошибок SQL Server.

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

См. также

Справочник

Основные понятия