Занятие 4. Начало диалога и передача сообщений
На этом занятии вы узнаете, как начать диалог между двумя базами данных на одном экземпляре компонента Database Engine. Вы также научитесь завершать простой цикл сообщений «запрос-ответ», а затем заканчивать диалог.
Процедуры
Переключение в базу данных InitiatorDB
Скопируйте и вставьте следующий код в окно редактора запросов. После этого выполните его, чтобы переключить контекст в базу данных InitiatorDB, в которой инициируется диалог.
USE InitiatorDB; GO
Начало диалога и отправка сообщения-запроса
Скопируйте и вставьте следующий код в окно редактора запросов. Затем выполните его, чтобы начать диалог и отправить сообщение-запрос к службе //TgtDB/2DBSample/TargetService в базе данных TargetDB. Этот код необходимо запускать единым блоком, поскольку для передачи дескриптора диалога из инструкции BEGIN DIALOG в инструкцию SEND используется переменная. Пакет запускает инструкцию BEGIN DIALOG, чтобы начать диалог и создать сообщение-запрос. Затем в инструкции SEND используется дескриптор диалога, чтобы отправить в этом диалоге сообщение-запрос. Последняя инструкция SELECT выводит текст отправленного сообщения.
DECLARE @InitDlgHandle UNIQUEIDENTIFIER; DECLARE @RequestMsg NVARCHAR(100); BEGIN TRANSACTION; BEGIN DIALOG @InitDlgHandle FROM SERVICE [//InitDB/2DBSample/InitiatorService] TO SERVICE N'//TgtDB/2DBSample/TargetService' ON CONTRACT [//BothDB/2DBSample/SimpleContract] WITH ENCRYPTION = OFF; SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//BothDB/2DBSample/RequestMessage] (@RequestMsg); SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
Переключение в базу данных TargetDB
Скопируйте и вставьте следующий код в окно редактора запросов. После этого выполните его, чтобы переключить контекст в базу данных TargetDB, в которой будет получено сообщение-запрос и отправлено ответное сообщение в базу данных InitiatorDB.
USE TargetDB; GO
Получение запроса и отправка ответа
Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы получить ответное сообщение из базы данных TargetQueue2DB и отправить ответное сообщение вызывающей стороне. Инструкция 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 TargetQueue2DB ), TIMEOUT 1000; SELECT @RecvReqMsg AS ReceivedRequestMsg; IF @RecvReqMsgName = N'//BothDB/2DBSample/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg); END CONVERSATION @RecvReqDlgHandle; END SELECT @ReplyMsg AS SentReplyMsg; COMMIT TRANSACTION; GO
Переключение в базу данных InitiatorDB
Скопируйте и вставьте следующий код в окно редактора запросов. После этого выполните его, чтобы переключить контекст обратно в базу данных InitiatorDB, в которой будет получено ответное сообщение и завершится диалог.
USE InitiatorDB; GO
Получение ответа и завершение диалога
Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы получить ответное сообщение и завершить диалог. Инструкция RECEIVE получает сообщение ответа из базы данных InitiatorQueue2DB. Инструкция END CONVERSATION завершает работу инициирующей стороны диалога. Последняя инструкция SELECT выводит текст ответного сообщения, что позволяет убедиться в том, что оно совпадает с сообщением, отправленным на предыдущем шаге.
DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue2DB ), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; -- Display recieved request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Следующие шаги
На этом шаге работа с учебником завершается. Учебники содержат только вводную информацию. В них нет описаний всех доступных параметров. В учебниках используется упрощенная логика и обработка ошибок, поэтому их не следует использовать в производственной среде. Чтобы создавать эффективные, надежные и устойчивые в работе диалоги, требуется более сложный код, чем представленный в этом учебнике.
См. также