在调试启用NServiceBus的应用程序时,我将某些消息在控制台中报告为“最多次失败”。
当我将调试器附加到处理程序时,一切都按照我的预期运行。处理程序不会抛出异常。
然而,处理程序确实创建了一个SQLTransaction,并且有意地将事务作为处理某些消息方案的一部分而回滚。似乎是正在回滚事务的消息是被报告为失败的消息。
SQLTransactions和NServiceBus之间是否存在某种关系会导致NServiceBus识别出发生了回滚?
我知道这听起来不太可能,但是在这个阶段无法想到可能导致信息失败的其他事情?
答案 0 :(得分:3)
我的猜测(没有看到异常错误消息)是您的错误来自手动处理SQL事务。
如果您使用默认设置运行NServiceBus,则消息处理发生在.NET TransactionScope
内,也称为“环境事务”。您的SQL事务很可能在环境事务中被登记,因此您手动回滚事务将导致错误。
“惯用的NServiceBus方式”(至少你对环境事务和DTC没问题)是让NServiceBus完成所有事务处理。因此,您应该让处理程序A)执行其工作,或者B)抛出异常。
在这两种情况下,环境事务将确保任何登记的事务将被提交/回滚,具体取决于A或B.