Занятие 2. Начало диалога и передача сообщений
На этом занятии вы получите навыки начала диалога и завершения простого цикла сообщений «запрос-ответ» с последующим окончанием диалога.
Процедуры
Переключение на базу данных AdventureWorks
Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы переключить контекст на базу данных AdventureWorks.
USE AdventureWorks; 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 получает ответное сообщение из базы данных IInitiatorQueue1DB. Инструкция 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. Удаление объектов диалога.
См. также