Занятие 2. Создание процедуры внутренней активации
Это занятие содержит сведения о том, как создать хранимую процедуру для обработки сообщений из очереди компонента Service Broker. В нем также поясняется, как настроить активацию процедуры при появлении сообщений в очереди.
Процедуры
Переключитесь на базу данных AdventureWorks2008R2
Скопируйте следующий код и вставьте в окно редактора запросов. Затем запустите его, чтобы переключить контекст на базу данных База данных AdventureWorks2008R2.
USE AdventureWorks2008R2; GO
Создание внутренней хранимой процедуры активации
Скопируйте следующий код и вставьте в окно редактора запросов. Затем, выполните его, чтобы создать хранимую процедуру. Выполняемая хранимая процедура продолжает получать сообщения все время, пока таковые имеются в очереди. Если по истечении времени ожидания ни одного сообщения не получено, хранимая процедура завершается. Если полученное сообщение содержит запрос, хранимая процедура возвращает сообщение, содержащее ответ. Если полученное сообщение является сообщением EndDialog, хранимая процедура завершает целевую сторону диалога. Если полученное сообщение является сообщением Error, выполняется откат транзакции.
CREATE PROCEDURE TargetActivProc AS DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; WHILE (1=1) BEGIN BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueueIntAct ), TIMEOUT 5000; IF (@@ROWCOUNT = 0) BEGIN ROLLBACK TRANSACTION; BREAK; END IF @RecvReqMsgName = N'//AWDB/InternalAct/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//AWDB/InternalAct/ReplyMessage] (@ReplyMsg); END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' BEGIN END CONVERSATION @RecvReqDlgHandle; END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/Error' BEGIN END CONVERSATION @RecvReqDlgHandle; END COMMIT TRANSACTION; END GO
Изменение целевой очереди для указания внутренней активации
Скопируйте следующий код и вставьте в окно редактора запросов. Затем выполните его, чтобы задать активацию компонентом Service Broker хранимой процедуры TargetActiveProc для обработки сообщений из очереди TargetQueueIntAct. Компонент Service Broker запускает копию процедуры TargetActiveProc каждый раз при получении сообщения в очереди TargetQueueIntAct при условии, что ни одна копия этой процедуры еще не запущена. Компонент Service Broker запускает дополнительные копии процедуры TargetActiveProc каждый раз, когда уже работающие копии не успевают обрабатывать входящие сообщения в имеющемся количестве.
ALTER QUEUE TargetQueueIntAct WITH ACTIVATION ( STATUS = ON, PROCEDURE_NAME = TargetActivProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF ); GO
Следующие шаги
Настройка База данных AdventureWorks2008R2 для поддержки диалога между службами //AWDB/InternalAct/InitiatorService и //AWDB/InternalAct/TargetService успешно завершена. Теперь завершим диалог с использованием данной конфигурации. См. раздел Занятие 3. Начало диалога и передача сообщений.
См. также