【问题标题】:Service Broker tutorial - left with conversations on the Target databaseService Broker 教程 - 留下关于目标数据库的对话
【发布时间】: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


    【解决方案1】:

    为了防止重放攻击,会延迟 30 分钟删除目标端点。 sys.conversation_endpoint.security_timestamp 是否设置在 CLOSED 端点上?

    【讨论】:

    • 啊,好的,目标数据库中的 security_timestamp 列在对话结束后 30 分钟有一个日期时间。所以这是什么时候被删除?
    • 它不会早于该时间戳被删除。
    【解决方案2】:

    除了 Remus 的进一步说明:如果对话无法正常完成,它仍然可以显示在 sys.conversation_endpoint 之外的 security_timestamp。在这种情况下,您可以使用唯一标识符 sys.conversation_endpoint.conversation_handle(即 94798AB6-DF37-E211-BF0F-002215A14A37)手动删除对话:

    END CONVERSATION conversation_handle WITH CLEANUP
    

    WITH CLEANUP很重要,请看MSDN:END CONVERSATION (Transact-SQL)

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 2010-11-21
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多