Service Broker对话未关闭(处于CONVERSING状态)

时间:2010-11-23 10:35:26

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

我注意到一些对话没有被关闭,保持在CONVERSING状态。奇怪的是,队列配置为一次只处理1条消息。然而,在实践中,在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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用“END CONVERSATION”会话句柄'WITH CLEANUP;'结束谈话并不是一种正确的方式。

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

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

答案 2 :(得分:-1)

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

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