NServiceBus - 消息报告为“失败的最大次数”,但我可以看到它被操作并且没有抛出异常

时间:2012-01-11 11:30:59

标签: nservicebus

在调试启用NServiceBus的应用程序时,我将某些消息在控制台中报告为“最多次失败”。

当我将调试器附加到处理程序时,一切都按照我的预期运行。处理程序不会抛出异常。

然而,处理程序确实创建了一个SQLTransaction,并且有意地将事务作为处理某些消息方案的一部分而回滚。似乎是正在回滚事务的消息是被报告为失败的消息。

SQLTransactions和NServiceBus之间是否存在某种关系会导致NServiceBus识别出发生了回滚?

我知道这听起来不太可能,但是在这个阶段无法想到可能导致信息失败的其他事情?

1 个答案:

答案 0 :(得分:3)

我的猜测(没有看到异常错误消息)是您的错误来自手动处理SQL事务。

如果您使用默认设置运行NServiceBus,则消息处理发生在.NET TransactionScope内,也称为“环境事务”。您的SQL事务很可能在环境事务中被登记,因此您手动回滚事务将导致错误。

“惯用的NServiceBus方式”(至少你对环境事务和DTC没问题)是让NServiceBus完成所有事务处理。因此,您应该让处理程序A)执行其工作,或者B)抛出异常。

在这两种情况下,环境事务将确保任何登记的事务将被提交/回滚,具体取决于A或B.