5

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

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

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

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

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

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

版本:

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

1 回答 1

3

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

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

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

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException

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

更多信息

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

于 2015-11-02T14:44:53.180 回答