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


Урок 2. Начало диалога и передача сообщений

Область применения: SQL Server Управляемый экземпляр SQL Azure

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

Процедуры

Примечание.

Примеры кода в этой статье были протестированы с помощью примера базы данных AdventureWorks2022, которую можно скачать с домашней страницы примеров Microsoft SQL Server и проектов сообщества.

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

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

        USE AdventureWorks2008R2;
        GO
    

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

  • Скопируйте и вставьте следующий код в окно Редактор запросов. Затем запустите его, чтобы начать беседу и отправить сообщение запроса в //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
    

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

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

        DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
        DECLARE @RecvReqMsg NVARCHAR(100);
        DECLARE @RecvReqMsgName sysname;
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReqDlgHandle = conversation_handle,
            @RecvReqMsg = message_body,
            @RecvReqMsgName = message_type_name
          FROM TargetQueue1DB
        ), TIMEOUT 1000;
    
        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
    

Получение ответа и завершение беседы

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

        DECLARE @RecvReplyMsg NVARCHAR(100);
        DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReplyDlgHandle = conversation_handle,
            @RecvReplyMsg = message_body
          FROM InitiatorQueue1DB
        ), TIMEOUT 1000;
    
        END CONVERSATION @RecvReplyDlgHandle;
    
        SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
        COMMIT TRANSACTION;
        GO
    

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

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

См. также