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メッセージキューは非トランザクションです。

助けてくれてありがとう、ロブ

完全な例外スタックトレース:

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 に答える