Sql server 2008 r2 ServiceBroker教程-左侧为目标数据库上的对话

Sql server 2008 r2 ServiceBroker教程-左侧为目标数据库上的对话,sql-server-2008-r2,service-broker,Sql Server 2008 R2,Service Broker,我正在尝试学习SQLServiceBroker(SSB),首先我将学习一些有关MSDN的简单教程。我在看“”。在启动器和目标数据库上设置请求和应答消息,两个数据库上都有使用这些消息的约定,启动器数据库上有使用队列的服务,目标数据库上有使用队列和约定的服务 发起程序向目标服务发送一条消息,开始一个对话框。目标接收此消息并发送回复(并调用结束对话),最后发起方接收回复并调用结束对话 如果我现在在启动器上执行从sys.conversation\u端点选择*的操作,则不会返回任何行。但是,目标数据库上返

我正在尝试学习SQLServiceBroker(SSB),首先我将学习一些有关MSDN的简单教程。我在看“”。在启动器和目标数据库上设置请求和应答消息,两个数据库上都有使用这些消息的约定,启动器数据库上有使用队列的服务,目标数据库上有使用队列和约定的服务

发起程序向目标服务发送一条消息,开始一个对话框。目标接收此消息并发送回复(并调用
结束对话
),最后发起方接收回复并调用
结束对话

如果我现在在启动器上执行从sys.conversation\u端点选择*的操作,则不会返回任何行。但是,目标数据库上返回了一行;对话处于关闭状态

这是否正确(即目标数据库是否仍应存储此对话)?如果没有,我如何摆脱目标数据库上的对话?如果是正确的,这些对话什么时候消失

这是目标数据库接收请求并发送回复的代码:

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
DECLARE@RecvReqDlgHandle UNIQUEIDENTIFIER;
声明@RecvReqMsg NVARCHAR(100);
声明@RecvReqMsgName sysname;
开始交易;
等待
(接收顶部(1)
@RecvReqDlgHandle=对话\u句柄,
@RecvReqMsg=消息体,
@RecvReqMsgName=消息类型名称
来自TargetQueue2DB
),超时1000;
选择@RecvReqMsg作为receivedRequestsMsg;
如果@RecvReqMsgName=
N'//BothDB/2DBSample/RequestMessage'
开始
声明@ReplyMsg NVARCHAR(100);
选择@ReplyMsg=
N“启动器服务的消息”;
发送对话@RecvReqDlgHandle
消息类型
[//BothDB/2DBSample/ReplyMessage](@ReplyMsg);
结束对话@RecvReqDlgHandle;
结束
提交事务;
去

删除目标端点时会延迟30分钟,以防止重播攻击。是否在关闭的端点上设置了
sys.conversation\u endpoint.security\u timestamp
?除了Remus之外,还需要进一步澄清:如果会话无法正常完成,它仍然可以显示在
sys.conversation\u endpoint
中,超出
security\u timestamp
。在这种情况下,您可以使用唯一标识符
sys.conversation\u endpoint.conversation\u handle
(即94798AB6-DF37-E211-BF0F-002215A14A37)手动删除对话:

END CONVERSATION conversation_handle WITH CLEANUP

清理
很重要,请参阅MSDN:

啊好的,目标数据库中的安全时间戳列在对话结束后30分钟有一个日期时间。那么这就是它将被删除的时间?它将在不早于该时间戳的时间内被删除。