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


Занятие 3. Начало диалога и передача сообщений

Это занятие содержит сведения о том, как выполнить простой цикл сообщений «запрос-ответ» в системе, для которой настроено использование внутренней хранимой процедуры активации.

Процедуры

Переключитесь на базу данных AdventureWorks2008R2

  • Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы переключить контекст на базу данных AdventureWorks2008R2.

    USE AdventureWorks2008R2;
    GO
    

Начните диалог и отправьте сообщение-запрос

  • Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы начать диалог, и направьте сообщение-запрос службе //AWDB/InternalAct/TargetService. Этот код необходимо запускать единым блоком, поскольку для передачи дескриптора диалога из инструкции BEGIN DIALOG в инструкцию SEND используется переменная. Пакет выполняет инструкцию BEGIN DIALOG для начала диалога. Он формирует сообщение-запрос и затем с помощью дескриптора диалога в инструкции SEND направляет сообщение-запрос по этому диалогу. Последняя инструкция SELECT выводит текст отправленного сообщения.

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/InternalAct/InitiatorService]
         TO SERVICE
          N'//AWDB/InternalAct/TargetService'
         ON CONTRACT
          [//AWDB/InternalAct/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    -- Send a message on the conversation
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/InternalAct/RequestMessage]
         (@RequestMsg);
    
    -- Diplay sent request.
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Получение запроса и отправка ответа

  • При отправке сообщения-запроса компонент Service Broker автоматически активирует копию хранимой процедуры TargetActiveProc. Хранимая процедура получает сообщение-ответ из очереди TargetQueueIntAct и отправляет сообщение-ответ обратно инициатору.

Получение ответа и завершение диалога

  • Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы получить ответное сообщение и завершить диалог. Инструкция RECEIVE получает сообщение-ответ из очереди InitiatorQueueIntAct. Инструкция END CONVERSATION завершает сторону, инициировавшую диалог, и отправляет сообщение EndDialog целевой службе. Последняя инструкция SELECT выводит текст ответного сообщения, что позволяет убедиться в том, что оно совпадает с сообщением, отправленным на предыдущем шаге.

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
        FROM InitiatorQueueIntAct
    ), TIMEOUT 5000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Завершение целевой стороны диалога

  • При выполнении инструкции END CONVERSATION для стороны-инициатора компонент Service Broker отправляет сообщение EndDialog в очередь TargetQueueIntAct. Хранимая процедура TargetActiveProc получает сообщение EndDialog и запускает инструкцию END CONVERSATION, которая завершает целевую сторону диалога.

Следующие шаги

Цикл обмена сообщениями «запрос-ответ» между службами //AWDB/InternalAct/InitiatorService и //AWDB/InternalAct/TargetService успешно осуществлен. При возникновении потребности передать пару сообщений «запрос-ответ» шаги, описанные на этом занятии, можно выполнять любое число раз. По завершении исследования инструкций SEND и REPLY можно удалить все объекты, используемые в процессе диалога. Дополнительные сведения см. в разделе Занятие 4. Удаление объектов диалога.