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


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

Добавления: 15 сентября 2007 г.

На этом занятии вы узнаете, как начать диалог между двумя базами данных на одном экземпляре Database Engine. Вы также научитесь завершать простой цикл сообщений «запрос-ответ», а затем заканчивать диалог.

Процедуры

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

  1. Скопируйте и вставьте следующий код в окно редактора запросов. После этого выполните его, чтобы переключить контекст в базу данных InitiatorDB, в которой инициируется диалог.

    USE InitiatorDB;
    GO
    

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

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

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE [//InitDB/2DBSample/InitiatorService]
         TO SERVICE N'//TgtDB/2DBSample/TargetService'
         ON CONTRACT [//BothDB/2DBSample/SimpleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
       N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE [//BothDB/2DBSample/RequestMessage]
          (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

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

  1. Скопируйте и вставьте следующий код в окно редактора запросов. После этого выполните его, чтобы переключить контекст в базу данных TargetDB, в которой будет получено сообщение-запрос и отправлено ответное сообщение в базу данных InitiatorDB.

    USE TargetDB;
    GO
    

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

  1. Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы получить ответное сообщение из базы данных TargetQueue2DB и отправить ответное сообщение вызывающей стороне. Инструкция RECEIVE получает сообщение запроса. Следующая инструкция SELECT выводит текст, позволяющий убедиться, что получено то же сообщение, что было отправлено на предыдущем шаге. Инструкция IF проверяет, имеет ли полученное сообщение тип запроса и используется ли инструкция SEND для отправки ответного сообщения вызывающей стороне. Она также проверяет, используется ли инструкция END CONVERSATION для завершения диалога на стороне цели. Последняя инструкция SELECT выводит текст ответного сообщения.

    DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg NVARCHAR(100);
    DECLARE @RecvReqMsgName sysname;
    
    BEGIN TRANSACTION;
    
    RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
    FROM TargetQueue2DB;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//BothDB/2DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
            N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE
                [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

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

  1. Скопируйте и вставьте следующий код в окно редактора запросов. После этого выполните его, чтобы переключить контекст обратно в базу данных InitiatorDB, в которой будет получено ответное сообщение и завершится диалог.

    USE InitiatorDB;
    GO
    

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

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

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

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

На этом шаге работа с учебником завершается. Учебники содержат только краткий обзор и не описывают все доступные возможности. Учебники направлены на усвоение фундаментальных операций, поэтому в них упрощены логика и обработка ошибок. Чтобы создавать эффективные и надежные диалоги, требуется более сложный код, чем представленный в этом учебнике.

Вернуться к учебникам по компоненту Service Broker

Учебники по компоненту Service Broker

См. также

Другие ресурсы

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
SEND (Transact-SQL)
WAITFOR (Transact-SQL)
Service Broker Programming Basics

Справка и поддержка

Получение помощи по SQL Server 2005