Создание приложений для работы с компонентом Service Broker
Использовать компонент Service Broker может любая программа, способная выполнять инструкции Transact-SQL. Реализовать приложение, работающее с компонентом Service Broker, можно как программу, выполняемую вне SQL Server, или как хранимую процедуру, написанную на языке Transact-SQL или одном из языков платформы .NET.
Программа, работающая с компонентом Service Broker, обычно состоит из ряда компонентов, которые взаимодействуют друг с другом с целью решения той или иной задачи. Программа, запускающая диалог, создает сообщение и отправляет его другой службе. После этого она может дожидаться ответа или сразу же завершить взаимодействие с расчетом на то, что ответ будет обработан другой программой. Если служба является целевой для диалога, то программа получает входящее сообщение из очереди службы, считывает данные сообщения, выполняет необходимую обработку, а затем, если необходимо, создает и отправляет ответное сообщение.
Компонент Service Broker расширяет возможности языка Transact-SQL. Для работы с компонентом Service Broker не требуется специальная объектная модель или библиотека. Вместо этого программы отправляют экземплярам SQL Server команды Transact-SQL и обрабатывают результаты их выполнения. Приложение может быть активировано компонентом Service Broker, запущено как фоновая служба, как запланированное задание или в ответ на событие. Дополнительные сведения о стратегиях запуска приложений, работающих с компонентом Service Broker, см. в разделе Выбор стратегии запуска.
Сведения о создании приложений, работающих с компонентом Service Broker, см. в разделе Преимущества программирования с компонентом Service Broker.
Обзор приложений, работающих с компонентом Service Broker
Взаимодействия компонентов приложения, работающего с компонентом Service Broker, показаны на следующем рисунке:
Как показано на рисунке, сначала создаются сообщения типов SubmitExpense, AcceptDenyExpense и ReimbursementIssued. На основе этих типов сообщений создается контракт ProcessExpenses, который определяет схему диалога, проводимого для выполнения задачи возмещения расходов (expense reimbursement). Контракт ProcessExpenses регламентирует все диалоги между службами ProcessExpense и SubmitExpense. Контракт ProcessExpenses и связанные с ним типы сообщений должны существовать в базах данных всех служб, ведущих диалоги на основе этого контракта.
Сообщения, отправляемые службе SubmitExpense, компонент Service Broker сохраняет в очереди этой службы. Хранимая процедура ExpenseSubmission получает сообщения из этой очереди, обрабатывает их и отправляет другой службе ответы, если это необходимо.
Сообщения, отправляемые службе ProcessExpense, компонент Service Broker сохраняет в очереди этой службы. Хранимая процедура ExpenseProcessing получает сообщения из этой очереди, обрабатывает их и отправляет другой службе ответы, если это необходимо.
Диалог между двумя этими службами имел бы следующую структуру:
Посредством пользовательского интерфейса пользователь отправляет запрос о возмещении расходов. Приложение выполняет хранимую процедуру ExpenseSubmission, которая создает сообщение SubmitExpense. Служба SubmitExpense запускает диалог со службой ProcessExpense, а потом отправляет ей сообщение SubmitExpense.
Компонент Service Broker получает адресованное службе ProcessExpense сообщение SubmitExpense и помещает его в очередь ExpenseQueue. Очередь ExpenseQueue активирует хранимую процедуру ProcessExpense, которая извлекает сообщение SubmitExpense из очереди и обрабатывает его. После этого хранимая процедура ProcessExpense создает сообщение AcceptDenyExpense и отправляет его службе SubmitExpense. Если в возмещении расходов отказано, хранимая процедура ProcessExpense завершает диалог.
Компонент Service Broker помещает сообщение AcceptDenyExpense в очередь службы SubmitExpense. Если хранимая процедура ProcessExpense завершила диалог, компонент Service Broker помещает в очередь Expenses сообщение EndDialog. Эта очередь активирует хранимую процедуру ExpenseSubmission, которая извлекает сообщение AcceptDenyExpense из очереди и обрабатывает его. Если хранимая процедура ExpenseSubmission получает из очереди сообщение EndDialog, она завершает диалог.
Если запрос о возмещении расходов удовлетворен, служба ProcessExpense подтверждает это, создавая и отправляя сообщение ReimbursementIssued, после чего завершает диалог. Компонент Service Broker помещает эти сообщения в очередь другой службы. Эта очередь активирует хранимую процедуру ExpenseSubmission, которая обрабатывает сообщение ReimbursementIssued. Затем процедура обрабатывает сообщение EndDialog и завершает диалог.
См. также