微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

Application: NServiceBus.Host.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: system.invalidOperationException
Stack:
at System.Transactions.TransactionState.ChangeStatePromotedPhase0(System.Transactions.InternalTransaction)
at System.Transactions.Phase0VolatileDemultiplexer.InternalPrepare()
at System.Transactions.VolatileDemultiplexer.PoolablePrepare(System.Object)
at System.Transactions.Oletx.OletxVolatileEnlistment.Prepare(System.Transactions.Oletx.OletxVolatileEnlistmentContainer)
at System.Transactions.Oletx.OletxPhase0VolatileEnlistmentContainer.Phase0Request(Boolean)
at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object,Boolean)
at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object,Boolean)

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

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

我们在log4net日志文件中看不到任何致命错误.

版本:

> Windows Server 2008 R2
> .NET Framework 4.5.2
> NServiceBus 4.7.5
> NHibernate 3.3.3.4001(用于传奇,订阅和超时持久性)
> sql Server 2012

解决方法

看来你看到的行为与NHibernate如何处理 TransactionCompleted事件有关.这个问题也是某种方式 related to this question.

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

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

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException

private static void OnUnhandledException(object sender,UnhandledExceptionEventArgs e)
{
    LogManager.GetLogger(typeof(AppDomain)).Fatal(“Unhandled exception”,e.ExceptionObject as Exception);
}

更多信息see

当这解决了中间问题时,找到与NHibernate结合的数据库服务器连接问题的根本原因是有意义的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐