在本课中,你将学习如何在配置了内部激活存储过程的系统中完成基本请求-回复消息周期。
过程
切换到 AdventureWorks 数据库
注意
本文中的代码示例是使用 AdventureWorks2025 示例数据库进行测试的,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以将上下文切换到 AdventureWorks2025 数据库。
USE AdventureWorks2022;
GO
启动会话并发送请求消息
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以启动对话并将请求消息发送到 AWDB/InternalAct/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/InternalAct/InitiatorService]
TO SERVICE N'//AWDB/InternalAct/TargetService'
ON CONTRACT [//AWDB/InternalAct/SampleContract]
WITH ENCRYPTION = OFF;
-- Send a message on the conversation
SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>';
SEND ON CONVERSATION (@InitDlgHandle)
MESSAGE TYPE [//AWDB/InternalAct/RequestMessage] (@RequestMsg);
-- Display sent request.
SELECT @RequestMsg AS SentRequestMsg;
COMMIT TRANSACTION;
GO
接收请求并发送答复
当你发送请求消息时,Service Broker 会自动激活 TargetActiveProc 的副本。 存储过程会从 TargetQueueIntAct 接收该请求消息,并向发起方发送回一条回复消息。
接收答复并结束会话
复制以下代码并将其粘贴到查询编辑器窗口中。 然后,运行代码来接收答复消息并结束会话。 该 RECEIVE 语句从 InitiatorQueueIntAct 检索回复消息。 该 END CONVERSATION 语句结束会话的发起方,并将 EndDialog 消息发送到目标服务。 最后 SELECT 一条语句显示答复消息的文本,以便可以确认它与上一步中发送的内容相同。
DECLARE @RecvReplyMsg AS NVARCHAR (100);
DECLARE @RecvReplyDlgHandle AS UNIQUEIDENTIFIER;
BEGIN TRANSACTION;
WAITFOR (RECEIVE TOP (1) @RecvReplyDlgHandle = conversation_handle,
@RecvReplyMsg = message_body FROM InitiatorQueueIntAct),
TIMEOUT 5000;
END CONVERSATION @RecvReplyDlgHandle;
-- Display received request.
SELECT @RecvReplyMsg AS ReceivedReplyMsg;
COMMIT TRANSACTION;
GO
在会话的目标方结束会话
当你为发起方运行 END CONVERSATION 语句时,Service Broker 会将 EndDialog 消息发送到 TargetQueueIntAct 队列。
TargetActiveProc 过程接收 EndDialog 消息,并发出END CONVERSATION结束会话的目标端的消息。
后续步骤
你已成功完成 AWDB/InternalAct/InitiatorService 与 AWDB/InternalAct/TargetService 之间的请求-回复消息周期。 您可以根据需要多次重复本课中的步骤以传输一对请求-答复消息。 完成检查 SEND 和 REPLY 语句后,可以删除会话使用的所有对象。