Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: 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. Удаление объектов диалога.