系统中未处理的异常.事务在网络不稳定时停止Windows服务
本文关键字:定时 服务 Windows 网络 未处理 异常 事务 系统 | 更新日期: 2023-09-27 18:12:34
我们正在运行一个基于nservicebus的服务,使用NServiceBus.Host.exe
主机进程。
在过去几个月的生产环境中,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.Transactions.Oletx.OletxVolatileEnlistment.Prepare (System.Transactions.Oletx.OletxVolatileEnlistmentContainer)System.Transactions.Oletx.OletxPhase0VolatileEnlistmentContainer.Phase0Request(布尔)System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(系统。对象,布尔)System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(系统。对象,布尔)
我们在几分钟的网络不稳定期间得到这个错误(例如,对数据库的大量超时,这在我们的log4net日志文件中可见)
有什么想法是失败的吗?
我们在log4net日志文件中没有看到致命错误。
版本:
- Windows Server 2008 R2
- 。. NET Framework 4.5.2
- NServiceBus 4.7.5
- NHibernate 3.3.3.4001(用于saga, subscription和timeout persister) SQL Server 2012
你看到的行为似乎与NHibernate如何处理TransactionCompleted
事件有关。这个问题在某种程度上也与这个问题有关。
AdoNetWithDistributedTransactionFactory
在TransactionCompleted事件上注册一个匿名委托。此事件通过使用ThreadPool.QueueUserWorkItem
在后台线程上触发。如果该操作由于数据库服务器的连接问题而抛出异常(例如:(由于网络分区),此异常在AppDomain上作为未观察到的异常引发。unhandleexception会破坏AppDomain,因此也会破坏NServiceBus.Host。
UnhandledException
处理程序,如下所示
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException
private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
LogManager.GetLogger(typeof(AppDomain)).Fatal(“Unhandled exception”, e.ExceptionObject as Exception);
}
更多信息见
当这解决了中间问题时,找到与数据库服务器连接问题的根本原因是有意义的,结合NHibernate