【问题标题】:Service Broker conversations not closed (staying in CONVERSING state)Service Broker 对话未关闭(保持在 CONVERSING 状态)
【发布时间】:2010-11-23 10:35:26
【问题描述】:

我注意到一些对话没有关闭,保持在 CONVERSING 状态。奇怪的是,队列被配置为一次只处理 1 条消息。然而,在实践中,有 2 个会话处于 CONVERSING 状态,一个确实在做一些工作,另一个似乎卡住了。

我使用的是单个队列和服务,这与通常的服务代理实现不同(使它更像是独白而不是对话)。我正在启动激活 SP:

RECEIVE TOP(1)
    @Handle = conversation_handle,
    @MsgTypeName = message_type_name
FROM [//MyQueue]

IF (@@ROWCOUNT = 0)
    RETURN
ELSE IF ((@MsgTypeName is null) or (@Handle is null))
    RETURN
ELSE IF (@MsgTypeName != '//MyRequest')
    BEGIN
        END CONVERSATION @Handle
        RETURN
    END

【问题讨论】:

  • 除非您提供更多代码(我不是在谈论业务逻辑,而是与代理相关的部分)以及您用来设置的 DDL 命令,否则很难为您提供帮助整件事。

标签: sql sql-server-2005 stored-procedures service-broker


【解决方案1】:

使用“END CONVERSATION '对话句柄' WITH CLEANUP;”不是结束对话的正确方式。

服务代理是为对话设计的,而不是独白对话。这也是为什么有 2 个对话(一个用于发送服务,另一个用于接收服务——因为服务可以驻留在不同的数据库/实例中)的原因

您可以创建发送服务,用于发送消息并接收“结束对话框”消息并结束对话框,另一个接收消息并对其进行一些处理+在工作完成时结束对话框。

【讨论】:

    【解决方案2】:

    你可以试试

    END CONVERSATION '对话句柄' WITH CLEANUP;

    我过去曾与服务经纪人合作过。我会为您提供一些我以前用于服务代理的故障排除链接

    http://www.mssqltips.com/tip.asp?tip=1197 http://blogs.msdn.com/b/sqlserverfaq/archive/2011/05/03/service-broker-concepts-and-troubleshooting.aspx

    ssbdiagnose 实用程序 - http://msdn.microsoft.com/en-us/library/bb934450.aspx

    【讨论】:

      【解决方案3】:
      ELSE IF (@MsgTypeName != '//MyRequest')
          BEGIN
              END CONVERSATION @Handle
              RETURN
          END
      

      不是个好主意。试试这个:

      IF @MsgTypeName = '//MyRequest'
      BEGIN
        /* Do something here with the message */
      END
      ESLE IF @MsgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
      BEGIN
          END CONVERSATION @Handle
      END
      ELSE IF @MsgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
      BEGIN
           END CONVERSATION @Handle
          /* do some error reporting here */
      END
      

      回想一下,发起者和目标都需要结束对话才能真正结束。并且目标是通常将第一个 END CONVERSATION 消息发送回发起者的目标。所以现在发起者(在上面的代码中)需要检查传入的消息类型并采取相应的行动。如果它被包装在一个存储过程中,它将收到实际的回复消息和 END CONVERSATION 消息,一个接一个。

      【讨论】:

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