第 2 课:启动会话和传输消息
新建日期: 2007 年 9 月 15 日
在本课中,您将学习如何启动一个会话并完成一个简单的请求/答复消息循环,然后结束会话。
过程
切换到 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