0

我开始使用 MassTransit,需要使用 RuntimeServices 来管理订阅和超时。我正在安装的环境是一个面向外部的网络,使用防火墙划分为多个部分。

当前,要安装 RuntimeServices 的应用程序服务器和 SQL Server 没有打开允许分布式事务协调器 (DTC) 正常工作的 RPC 端口。

下面列出了我得到的完整异常,但重要的部分看起来是这样System.Transactions.TransactionException: The operation is not valid for the state of the transaction.。由于未配置 DTC,我不相信该交易会启动。

虽然我应该能够要求打开正确的端口,但我不愿意这样做,因为我并不关心为此目的的交易。所以理想情况下,我想告诉 MassTransit 或者可能是 nHibernate,我不需要分布式事务。

顺便说一句,我的 MS 消息队列是非事务性的。

欢迎任何帮助,谢谢,Rob

完整的异常堆栈跟踪:

MassTransit.Context.ServiceBusReceiveContext-'System.Action'1[[MassTransit.IConsumeContext, MassTransit, Version=2.6.416.0, Culture=neutral, PublicKeyToken=null]]' threw an exception consuming message 'MassTransit.Context.ReceiveContext' NHibernate.Exceptions.GenericADOException: could not execute query [ select subscripti0_.CorrelationId as Correlat1_1_, subscripti0_.CurrentState as CurrentS2_1_, subscripti0_.ControlUri as ControlUri1_, subscripti0_.DataUri as DataUri1_ from dbo.SubscriptionClientSaga subscripti0_ where subscripti0_.CurrentState=? ] Name:p1 - Value:Active (State) [SQL: select subscripti0_.CorrelationId as Correlat1_1_, subscripti0_.CurrentState as CurrentS2_1_, subscripti0_.ControlUri as ControlUri1_, subscripti0_.DataUri as DataUri1_ from dbo.SubscriptionClientSaga subscripti0_ where subscripti0_.CurrentState=?] ---> System.Transactions.TransactionException: The operation is not valid for the state of the transaction. at System.Transactions.TransactionState.EnlistVolatile(InternalTransaction tx, IEnlistmentNotification enlistmentNotification, EnlistmentOptions enlistmentOptions, Transaction atomicTransaction) at System.Transactions.Transaction.EnlistVolatile(IEnlistmentNotification enlistmentNotification, EnlistmentOptions enlistmentOptions) at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.EnlistInDis tributedTransactionIfNeeded(ISessionImplementor session) at NHibernate.Impl.AbstractSessionImpl.EnlistInAmbientTransactionIfNeeded() at NHibernate.Impl.AbstractSessionImpl.CheckAndUpdateSessionStatus() at NHibernate.Impl.SessionImpl.get_Batcher() at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) --- End of inner exception stack trace --- at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) ... (elided for brevity!) ...

4

1 回答 1

0

在某些情况下,事务会自动升级为 DTC:http: //msdn.microsoft.com/en-us/library/ms131083.aspx

您绝对希望避免这种情况发生-它会破坏性能,选项:

  • 订阅服务不是资源密集型的,在本地托管其数据库。
  • 评估用于消息消费的范围,看能不能缩小
  • 如果使用 MSMQ,请使用多播而不是订阅服务
  • 考虑改用 RabbitMQ - 无需订阅服务

https://groups.google.com/forum/?fromgroups#!forum/masstransit-discuss是您可以快速获得 MassTransit 帮助的地方。

干杯,ET。

于 2013-03-12T13:15:02.473 回答