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


Занятие 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. Начало диалога и передача сообщений.