在本课中,你将学习如何开始对话,完成简单的请求-回复消息周期,然后结束对话。
过程
注意
本文中的代码示例是使用 AdventureWorks2025 示例数据库进行测试的,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。
切换到 AdventureWorks2008R2 数据库
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它,将上下文切换到 AdventureWorks2008R2 数据库。
USE AdventureWorks2008R2; GO
启动会话并发送请求消息
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以启动对话,并将请求消息发送到 AWDB/1DBSample/TargetService。 必须在一个块中运行代码,因为变量用于将对话句柄从
BEGIN DIALOG语句传递到SEND语句。 批处理运行BEGIN DIALOG语句以启动会话。 它生成请求消息,然后使用语句中的SEND对话句柄在该会话上发送请求消息。 最后SELECT一条语句显示已发送的消息的文本。DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER; DECLARE @RequestMsg AS 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 AS UNIQUEIDENTIFIER; DECLARE @RecvReqMsg AS NVARCHAR (100); DECLARE @RecvReqMsgName AS 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 AS 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 AS NVARCHAR (100); DECLARE @RecvReplyDlgHandle AS 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
相关任务
- 开始对话对话(Transact-SQL)
- SEND (Transact-SQL)
- RECEIVE (Transact-SQL)
- 结束对话(Transact-SQL)
- Service Broker 应用程序
后续步骤
你已成功完成 AWDB/1DBSample/InitiatorService 与 AWDB/1DBSample/TargetService 之间的请求-回复消息周期。 您可以根据需要多次重复本课中的步骤以传输一对请求-答复消息。 完成调查 SEND 和 REPLY 语句后,可以删除聊天使用的所有对象。