5

在 sys.transmission_queue 中,我得到的唯一信息是“一条或多条消息无法传递到此对话所针对的本地服务”。

如果我重新启用问题队列之一(有五个)并将激活设置为关闭,则队列将填满其消息。如果我随后运行 Activation SP,我会正确处理消息并且没有问题。但是一旦我打开激活,如果队列中有任何消息,队列将再次禁用自己。

我完全迷路了。有谁知道我该如何解决这个问题?

4

2 回答 2

11

作为对有毒消息处理保护的反应,队列会自行禁用。这意味着您激活的程序正在回滚,可能是由于某些异常。激活的过程没有发送错误的会话,因此它们将其发送到 ERRORLOG。检查您的错误日志,应该充满来自您激活程序的错误消息。

最简单的故障排除方法是在激活关闭时从 SSMS 手动运行激活的过程。尝试重新创建与激活相同的执行上下文,请参阅内部激活上下文。关键部分是 EXECUTE AS 上下文,它正在改变很多行为,尤其是安全性。所以试试这个(假设你的队列在下面执行dbo):

use <dbname>;
go

execute as user = 'dbo';
go

exec <sp_my_activated_proc>;
go

revert;
go

您可能会收到一条错误消息,这可能是您反复禁用的原因。

于 2013-03-29T18:17:09.303 回答
0

我会假设我正在处理这种有毒的消息。

队列在 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 语句停止了问题

于 2014-05-08T02:39:11.047 回答