2015-12-08 3 views
2

Я сейчас обновляю свой Rebus 0.45 до 0.70.3 и сталкивался с некоторыми проблемами/мыслями относительно конфигураций моих саг. Ранее я сделал следующее:Настройка саблей Rebus с UnitOfWork

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 для получения SqlTransaction, который обернут NHibernate.

+0

Я использую NHibernate, поэтому я мог использовать этот трюк, чтобы получить транзакцию. Должна ли Сага и Обработчик использовать один и тот же сеанс или это приведет к некоторому странному поведению, если один из них потерпит неудачу? В противном случае я просто использую UnitOfWorkManager, чтобы создать новый сеанс для Саги, а затем получить транзакцию с трюком, я полагаю? – Thestrup

+0

Если они используют то же самое, они будут выполнять свою работу в одной транзакции базы данных. Я не вижу причин, почему это не должно просто работать :) – mookid8000

Смежные вопросы