在 sys.transmission_queue 中,我得到的唯一信息是“一条或多条消息无法传递到此对话所针对的本地服务”。
如果我重新启用问题队列之一(有五个)并将激活设置为关闭,则队列将填满其消息。如果我随后运行 Activation SP,我会正确处理消息并且没有问题。但是一旦我打开激活,如果队列中有任何消息,队列将再次禁用自己。
我完全迷路了。有谁知道我该如何解决这个问题?
在 sys.transmission_queue 中,我得到的唯一信息是“一条或多条消息无法传递到此对话所针对的本地服务”。
如果我重新启用问题队列之一(有五个)并将激活设置为关闭,则队列将填满其消息。如果我随后运行 Activation SP,我会正确处理消息并且没有问题。但是一旦我打开激活,如果队列中有任何消息,队列将再次禁用自己。
我完全迷路了。有谁知道我该如何解决这个问题?
作为对有毒消息处理保护的反应,队列会自行禁用。这意味着您激活的程序正在回滚,可能是由于某些异常。激活的过程没有发送错误的会话,因此它们将其发送到 ERRORLOG。检查您的错误日志,应该充满来自您激活程序的错误消息。
最简单的故障排除方法是在激活关闭时从 SSMS 手动运行激活的过程。尝试重新创建与激活相同的执行上下文,请参阅内部激活上下文。关键部分是 EXECUTE AS 上下文,它正在改变很多行为,尤其是安全性。所以试试这个(假设你的队列在下面执行dbo
):
use <dbname>;
go
execute as user = 'dbo';
go
exec <sp_my_activated_proc>;
go
revert;
go
您可能会收到一条错误消息,这可能是您反复禁用的原因。
我会假设我正在处理这种有毒的消息。
队列在 2008 年和 2012 年发生第一条消息后禁用。但在我的 2008 r2 开发 PC 上运行良好
但是,“SQL Server 日志”中没有显示任何内容
如果我在没有激活子句的情况下创建队列并手动运行 SQL,则 SP 运行并返回而没有错误(日志中也没有任何内容),并且队列禁用
如果我设法找出原因,我会更新这个。
这是消息中毒 - 连续 5 次回滚后无声失败。
从未找到任何日志,但原因是我进行了 NULL 检查:
WAITFOR
(
RECEIVE TOP(1)
@msg = convert(xml,message_body),
@DlgId = conversation_handle
FROM dbo.AuditLog_Request_Queue
), TIMEOUT 1000;
-- exit when waiting has been timed out
IF @@ROWCOUNT = 0
BEGIN
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END
BREAK;
END
-- exit when waiting has been timed out
IF @msg IS NULL
BEGIN
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END
BREAK;
END
将其移至后面的 EXECUTE 语句停止了问题