【发布时间】:2015-09-23 17:19:29
【问题描述】:
我有一个托管许多后端 NServiceBus 端点的 Windows 2008 R2 服务器。所有依赖于 NServiceBus.Host.exe 主机(作为 Windows 服务安装)的服务都能够与 MSDTC 完美交互,全天平均处理少量并发分布式事务。然而,有 2 个小型 Web.API 应用程序自托管 NServiceBus 端点(作为发布者)在尝试处理订阅请求时不断收到以下错误:
NServiceBus.Transports.Msmq.MsmqDequeueStrategy 接收错误 消息。 System.Transactions.TransactionAbortedException: 交易已中止。 ---> System.Transactions.TransactionManagerCommunicationException: 与底层事务管理器的通信失败。 ---> System.Runtime.InteropServices.COMException:事务管理器 不可用。 (来自 HRESULT 的异常:0x8004D01B)在 System.Transactions.Oletx.IDtcProxyShimFactory.ConnectToProxy(字符串 nodeName, Guid resourceManagerIdentifier, IntPtr managedIdentifier, Boolean& nodeNameMatches, UInt32& whereaboutsSize, CoTaskMemHandle& whereaboutsBuffer, IResourceManagerShim&resourceManagerShim) 在 System.Transactions.Oletx.DtcTransactionManager.Initialize() --- 内部异常堆栈跟踪结束 --- 在 System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException) 在 System.Transactions.Oletx.DtcTransactionManager.Initialize() 在 System.Transactions.Oletx.DtcTransactionManager.get_ProxyShimFactory() 在 System.Transactions.Oletx.OletxTransactionManager.CreateTransaction(TransactionOptions 属性)在 System.Transactions.TransactionStatePromoted.EnterState(InternalTransaction tx) --- 内部异常堆栈跟踪结束 --- at System.Transactions.TransactionStateAborted.CheckForFinishedTransaction(InternalTransaction tx) 在 System.Transactions.Transaction.Promote() 在 System.Transactions.TransactionInterop.ConvertToOletxTransaction(交易 交易)在 System.Transactions.TransactionInterop.GetDtcTransaction(交易 交易)在 System.Messaging.MessageQueue.StaleSafeReceiveMessage(UInt32 超时, Int32 动作、MQPROPS 属性、NativeOverlapped* 重叠、 ReceiveCallback receiveCallback, CursorHandle cursorHandle, IntPtr 交易)在 System.Messaging.MessageQueue.ReceiveCurrent(时间跨度超时,Int32 动作,CursorHandle 游标,MessagePropertyFilter 过滤器, MessageQueueTransaction 内部事务, MessageQueueTransactionType 事务类型)在 System.Messaging.MessageQueue.Receive(时间跨度超时, MessageQueueTransactionType 事务类型)在 NServiceBus.Transports.Msmq.MsmqDequeueStrategy.ReceiveMessage(Func`1 接收)在 c:\BuildAgent\work\31f8c64a6e8a2d7c\src\NServiceBus.Core\Transports\Msmq\MsmqDequeueStrategy.cs:line 313
其他一些注意事项:
- 错误的 ApplicationPools 的身份和 Windows 服务的登录用户是相同的。
- 这在之前确实运行良好 最近重新启动,因为 Web.API 服务能够成功 处理订阅请求,并且能够发布消息 很好(虽然发布不会自动使用 MSDTC,而且我们是 不明确使用 TransactionScope)。由于本地重启,我们 如果有订阅请求消息,则只需获取上述错误 在任一 Web.API 发布者的输入队列中。
- 我使用了 procmon.exe 和 MSDTC 跟踪,但没有发现任何感兴趣的东西。典型的事件查看器日志也不提供任何信息。
- 所有端点都运行 .NET 4.5 和 NServiceBus 4.6
- 我们不能 在任何其他环境中重新创建它。
以下对话的补充说明
- 抛出异常的线程是纯 NServiceBus 订阅管理,其中不涉及任何“我的”代码。当应用程序池按需启动 w3wp.exe 工作进程时,NSB 会生成一个应用程序不知道的工作线程来处理订阅请求。它应该只在发布者的输入队列和订阅存储中工作,我也在使用 MSMQ,在另一个队列旁边(即据我所知,不涉及其他服务器)。
- 网站的“代码”在重新启动后没有改变,并且应用程序池在重新启动前停止并重新启动了几次,没有问题。
【问题讨论】:
-
这对您来说仍然是个问题吗?我遇到了同样的问题,因为(据说)神奇地我们的 DTC 不再有网络访问权限。我知道这个问题已经超过 3 个月了,但我很想知道解决方案是什么。我的问题通过以下方式解决:technet.microsoft.com/en-us/library/Cc753510(v=WS.10).aspx
标签: asp.net .net transactions nservicebus msdtc