Занятие 2. Начало диалога и передача сообщений
Добавления: 15 сентября 2007 г.
На этом занятии будет показано, как начать диалог, выполнить простой цикл отправки сообщения запроса и получения ответного сообщения, а затем закончить диалог.
Процедуры
Переключиться в базу данных 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
Получить запрос и отправить ответ
Скопируйте и вставьте следующий код в окно редактора запросов. Затем запустите его, чтобы получить ответное сообщение из базы данных TargetQueue2DB и отправить ответное сообщение вызывающей стороне. Инструкция RECEIVE получает сообщение запроса. Следующая инструкция SELECT служит для отображения текста, чтобы можно было проверить, совпадает ли он с сообщением в последнем шаге. Инструкция IF проверяет, имеет ли полученное сообщение тип запроса и используется ли инструкция SEND для отправки ответного сообщения вызывающей стороне. Инструкция END CONVERSATION используется для завершения работы целевой стороны диалога. Последняя инструкция SELECT выводит текст ответного сообщения.
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; BEGIN TRANSACTION; RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue1DB; 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 получает сообщение ответа из базы данных InitiatorQueue2DB. Инструкция END CONVERSATION завершает работу вызывающей стороны диалога. Последняя инструкция SELECT выводит текст сообщения ответа, что позволяет убедиться в том, что оно совпадает с сообщением, отправленным на предыдущем шаге.
DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue1DB; END CONVERSATION @RecvReplyDlgHandle; SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Следующие шаги
Вы успешно осуществили цикл обмена сообщениями запроса и ответа между службами //AWDB/1DBSample/InitiatorService и //AWDB/1DBSample/TargetService. Повторите шаги этого занятия любое желаемое количество раз, передавая пары сообщений запроса и ответа. Закончив изучение способов применения инструкций SEND и REPLY, можно удалить все объекты, которые использовались в диалоге. Дополнительные сведения см. в разделе Занятие 3. Удаление объектов диалога.
См. также
Другие ресурсы
BEGIN DIALOG CONVERSATION (Transact-SQL)
SEND (Transact-SQL)
RECEIVE (Transact-SQL)
END CONVERSATION (Transact-SQL)
Service Broker Programming Basics