3

我注意到一些对话没有关闭,保持在 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
4

3 回答 3

1

你能试一下吗

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

于 2011-08-13T05:58:13.987 回答
1

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

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

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

于 2012-01-23T14:55:56.317 回答
0
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-07-08T18:01:55.900 回答