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


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