我注意到一些对话没有被关闭,保持在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
答案 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消息,一个接着一个。