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

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

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

Процедуры

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

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

    USE AdventureWorks;
    GO
    

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

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

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/1DBSample/InitiatorService]
         TO SERVICE
          N'//AWDB/1DBSample/TargetService'
         ON CONTRACT
          [//AWDB/1DBSample/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/1DBSample/RequestMessage]
         (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    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 TargetQueue1DB;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//AWDB/1DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
         N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE 
              [//AWDB/1DBSample/ReplyMessage]
              (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    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 InitiatorQueue1DB;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

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

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

См. также

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

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

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

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