2015-12-08 17 views
2

我目前正在將我的Rebus 0.45更新爲0.70.3,並且遇到了關於我的傳奇配置的一些問題/想法。以前我也做了以下內容:使用UnitOfWork配置Rebus傳奇

var rebusConfigurer = Configure.With(new WindsorContainerAdapter(container)) 
           .Logging(l => l.Log4Net()).Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig()) 
           .MessageOwnership(o => o.FromRebusConfigurationSection()) 
           .Sagas(s => s.StoreInSqlServer(() => (SqlConnection)container.Resolve<INHibernateSessionFactory>().CreateSession().Connection, "sagas", "saga_index")) 
           .SpecifyOrderOfHandlers(s => s.Use(new MyMessageHandlerInspector())); 

現在,我必須使用ConnectionHolder我開始想,如果有可能使用我用我的處理程序相同UnitOfWorkManager在我的傳奇呢? 我的處理程序被配置爲這樣:

rebusConfigurer.Events(e => 
      { 
       e.MessageSent += AutomaticallySetTimeToBeReceived; 
       e.UncorrelatedMessage += EOnUncorrelatedMessage; 
       e.PoisonMessage += EOnPoisonMessage; 
       e.AddUnitOfWorkManager(new RebusNHibernateUnitOfWorkManager(container.Resolve<ISessionFactory>())); 
      }); 

如果這是不可能使用相同的UnitOfWork的事件和傳奇故事,我只是需要它來工作,在0.45我懷疑,我應該做點什麼沿這些行:

var rebusConfigurer = Configure.With(new WindsorContainerAdapter(container)) 
           .Logging(l => l.Log4Net()).Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig()) 
           .MessageOwnership(o => o.FromRebusConfigurationSection()) 
           .Sagas(s => s.StoreInSqlServer(() => ConnectionHolder.ForNonTransactionalWork((SqlConnection)container.Resolve<INHibernateSessionFactory>().CreateSession().Connection), "sagas", "saga_index")) 
           .SpecifyOrderOfHandlers(s => s.Use(new MyMessageHandlerInspector())); 

回答

1

您的配置看起來正確的,除了一兩件事:如果你有工作單位,我猜你使用NHibernate的創建一個交易呢?

如果是這種情況,您應該確保使用ConnectionHolder.ForTransactionalWork(...)工廠獲取連接所有者,然後您可以使用this nasty little trick來檢索由NHibernate包裝的SqlTransaction

+0

我正在使用NHibernate,所以我可以使用該技巧來獲得交易。 如果Saga和Handler使用相同的會話,或者會導致一些奇怪的行爲,如果其中一個失敗?否則,我只是使用UnitOfWorkManager爲佐賀創建一個新的會話,然後用這個技巧得到這個交易,我想呢? – Thestrup

+0

如果他們使用相同的,他們將在同一個數據庫事務中完成他們的工作。我可以看到沒有理由,爲什麼它不應該只是工作:) – mookid8000