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

问题描述 投票:2回答:3

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

我正在使用的一件事是单个队列和服务,它与通常的服务代理实现不同(使其更像是独白而不是对话)。我正在启动激活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
sql sql-server-2005 stored-procedures service-broker
3个回答
0
投票

使用“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


-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消息。

© www.soinside.com 2019 - 2024. All rights reserved.