使用 UnitOfWork 配置 Rebus sagas
Configuring Rebus sagas with UnitOfWork
我目前正在将我的 Rebus 0.45 更新到 0.70.3,并且遇到了一些 problems/thoughts 关于我的 sagas 配置的问题。以前我做过以下事情:
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,我开始想知道是否可以使用与我在 sagas 中的处理程序相同的 UnitOfWorkManager?
我的处理程序配置如下:
rebusConfigurer.Events(e =>
{
e.MessageSent += AutomaticallySetTimeToBeReceived;
e.UncorrelatedMessage += EOnUncorrelatedMessage;
e.PoisonMessage += EOnPoisonMessage;
e.AddUnitOfWorkManager(new RebusNHibernateUnitOfWorkManager(container.Resolve<ISessionFactory>()));
});
如果不能对 Events 和 Sagas 使用相同的 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()));
你的配置看起来是正确的,除了一件事:如果你有一个工作单元,我猜你也使用 NHibernate 来创建一个事务?
如果是这样,你应该确保使用ConnectionHolder.ForTransactionalWork(...)
工厂来获取连接持有者,然后你可以使用this nasty little trick来检索SqlTransaction
由 NHibernate 包装。
我目前正在将我的 Rebus 0.45 更新到 0.70.3,并且遇到了一些 problems/thoughts 关于我的 sagas 配置的问题。以前我做过以下事情:
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,我开始想知道是否可以使用与我在 sagas 中的处理程序相同的 UnitOfWorkManager? 我的处理程序配置如下:
rebusConfigurer.Events(e =>
{
e.MessageSent += AutomaticallySetTimeToBeReceived;
e.UncorrelatedMessage += EOnUncorrelatedMessage;
e.PoisonMessage += EOnPoisonMessage;
e.AddUnitOfWorkManager(new RebusNHibernateUnitOfWorkManager(container.Resolve<ISessionFactory>()));
});
如果不能对 Events 和 Sagas 使用相同的 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()));
你的配置看起来是正确的,除了一件事:如果你有一个工作单元,我猜你也使用 NHibernate 来创建一个事务?
如果是这样,你应该确保使用ConnectionHolder.ForTransactionalWork(...)
工厂来获取连接持有者,然后你可以使用this nasty little trick来检索SqlTransaction
由 NHibernate 包装。