System.Transactions 中的未处理异常在网络不稳定期间停止 Windows 服务

Sve*_*tøl 5 .net c# nhibernate nservicebus system.transactions

我们正在使用NServiceBus.Host.exe主机进程运行基于 NServiceBus 的服务。

在过去的几个月中,Windows 服务两次在生产中突然停止,在应用程序事件日志中留下以下事件:

应用程序:NServiceBus.Host.exe 框架版本:v4.0.30319 描述:由于未处理的异常,进程被终止。异常信息:System.InvalidOperationException 堆栈:在 System.Transactions.TransactionState.ChangeStatePromotedPhase0(System.Transactions.InternalTransaction) 在 System.Transactions.Phase0VolatileDemultiplexer.InternalPrepare() 在 System.Transactions.VolatileDemultiplexer.PoolablePrepare(System.Object) 在 System. .Oletx.OletxVolatileEnlistment.Prepare(System.Transactions.Oletx.OletxVolatileEnlistmentContainer) 在 System.Transactions.Oletx.OletxPhase0VolatileEnlistmentContainer.Phase0Request(Boolean) 在 System.Transactions.Oletx.OletxTransactionManager.SystemObject.Callback(SystemObject.Callback) _ThreadPoolWaitOrTimerCallback。

我们在几分钟的网络不稳定期间收到此错误(例如,对数据库的大量超时,这在我们的 log4net 日志文件中可见)

关于这里失败的任何想法?

我们在 log4net 日志文件中没有看到致命错误。

版本:

  • 视窗服务器 2008 R2
  • .NET 框架 4.5.2
  • NServiceBus 4.7.5
  • NHibernate 3.3.3.4001(用于saga、订阅和超时持久化)
  • SQL Server 2012

Dan*_*ach 3

您看到的行为似乎与 NHibernate 处理TransactionCompleted事件的方式有关。这个问题也与这个问题有某种联系

\n\n

AdoNetWithDistributedTransactionFactory在 TransactionCompleted 事件上注册一个匿名委托。该事件通过使用在后台线程上触发ThreadPool.QueueUserWorkItem。如果该操作由于数据库服务器的连接问题(即由于网络分区)而引发异常,则此异常将作为 AppDomain 上未观察到的异常引发。UnhandledExceptions 会破坏 AppDomain,因此也会破坏 NServiceBus.Host。

\n\n

最好的解决方法是UnhandledException在当前 AppDomain 上注册一个处理程序,如下所示

\n\n
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException\n\nprivate static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)\n{\n    LogManager.GetLogger(typeof(AppDomain)).Fatal(\xe2\x80\x9cUnhandled exception\xe2\x80\x9d, e.ExceptionObject as Exception);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

更多信息请参见

\n\n

当这解决了中间问题后,结合 NHibernate 来查找数据库服务器连接问题的根本原因就有意义了

\n