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 日志文件中没有看到致命错误。
版本:
您看到的行为似乎与 NHibernate 处理TransactionCompleted事件的方式有关。这个问题也与这个问题有某种联系。
AdoNetWithDistributedTransactionFactory在 TransactionCompleted 事件上注册一个匿名委托。该事件通过使用在后台线程上触发ThreadPool.QueueUserWorkItem。如果该操作由于数据库服务器的连接问题(即由于网络分区)而引发异常,则此异常将作为 AppDomain 上未观察到的异常引发。UnhandledExceptions 会破坏 AppDomain,因此也会破坏 NServiceBus.Host。
最好的解决方法是UnhandledException在当前 AppDomain 上注册一个处理程序,如下所示
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}\nRun Code Online (Sandbox Code Playgroud)\n\n更多信息请参见
\n\n当这解决了中间问题后,结合 NHibernate 来查找数据库服务器连接问题的根本原因就有意义了
\n| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |