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

Это занятие дает представление о том, как получить сообщение запроса из целевой очереди и отправить ответное сообщение службе инициатора. Эти шаги выполняют из копии среды Management Studio, запущенной на том же компьютере, где находится целевой экземпляр компонента Database Engine.

Процедуры

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

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

    USE InstTargetDB;
    GO
    

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

  • Скопируйте и вставьте следующий код в окно редактора запросов. Затем выполните его, чтобы выполнить получение ответного сообщения из очереди InstTargetQueue и отправку ответного сообщения обратно инициатору. Инструкция 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 InstTargetQueue
    ), TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName = N'//BothDB/2InstSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
            N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE [//BothDB/2InstSample/ReplyMessage]
              (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

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

Сообщение запроса получено, а ответное сообщение успешно отправлено службе инициатора. После этого можно получить ответное сообщение из очереди инициатора и завершить диалог. См. раздел Занятие 6. Получение ответа и завершение диалога.