Занятие 2. Создание процедуры внутренней активации
Это занятие содержит сведения о том, как создать хранимую процедуру для обработки сообщений из очереди компонента Service Broker. В нем также поясняется, как настроить активацию процедуры при появлении сообщений в очереди.
Процедуры
Переключение на базу данных AdventureWorks
Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы переключить контекст на базу данных AdventureWorks.
USE AdventureWorks; 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
Следующие шаги
Настройка базы данных AdventureWorks для поддержки диалога между службами //AWDB/InternalAct/InitiatorService и //AWDB/InternalAct/TargetService успешно завершена. Теперь завершим диалог с использованием данной конфигурации. См. раздел Занятие 3. Начало диалога и передача сообщений.
См. также