【发布时间】:2012-01-25 10:39:15
【问题描述】:
我正在尝试学习 SQL Service Broker (SSB),并从 MSDN 上的一些简单教程开始。我在看“Completing a Conversation Between Databases”。请求和回复消息在 Initiator 和 Target 数据库上设置,两个数据库上都有使用这些消息的 Contract,Initiator db 上的 Service 使用 Queue,Target 上的 Service 使用 Queue 和 Contract。
Initiator 向 Target Service 发送消息,开始对话。 Target 接收到这条消息并发送回复(并调用END CONVERSATION),最后 Initiator 接收到回复并调用END CONVERSATION。
如果我现在在 Initiator 上执行 SELECT * FROM sys.conversation_endpoints,则不会返回任何行。但是,目标数据库上返回了一行;对话处于CLOSED 状态。
这是否正确(即目标数据库是否仍应存储此对话)?如果没有,我如何摆脱目标数据库上的对话?如果正确,这些对话什么时候消失?
这是 Target db 接收请求并发送回复的代码:
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
COMMIT TRANSACTION;
GO
【问题讨论】:
标签: sql-server-2008-r2 service-broker