我不确定这是更多的NServiceBus问题,Windsor问题,还是仅仅是我自己的愚蠢问题 - 但我遇到了内存泄漏,这似乎仍然指向许多瞬态组件闲逛。
这就是我在IWantCustomInitialization.Init
方法中使用Windsor设置NServiceBus的方法:
var cont = new Castle.Windsor.WindsorContainer();
cont.Register(
Component.For<IWindsorContainer>().Instance(cont));
Configure.With()
.CastleWindsorBuilder(cont)
.DefiningCommandsAs(t => t.GetCustomAttributes(typeof(MyCommandAttribute), false).GetLength(0) > 0)
.DefiningEventsAs(t => t.GetCustomAttributes(typeof(MyEventAttribute), false).GetLength(0) > 0)
.DefiningMessagesAs(t => t.Namespace != null && t.Namespace.EndsWith(".LocalMessages"))
.XmlSerializer()
.Log4Net()
.IsolationLevel(System.Transactions.IsolationLevel.ReadCommitted)
.UseNHibernateTimeoutPersister()
.RunTimeoutManager()
.Sagas()
.NHibernateSagaPersister()
.DisableRavenInstall();
cont.Register(
Component.For<ISessionFactory>().Named("ABC").LifeStyle.Singleton.UsingFactoryMethod(() =>
{
return Fluently.Configure().Database(() =>
{
return MsSqlConfiguration.MsSql2005.UseOuterJoin()
.ConnectionString(x => x.FromConnectionStringWithKey("ABCData"))
.ShowSql();
}
).Mappings((m) =>
{
AddABCMappingsOnly(m.FluentMappings);
})
.ExposeConfiguration(cfg =>
{
SchemaMetadataUpdater.QuoteTableAndColumns(cfg);
var sv = new SchemaValidator(cfg);
sv.Validate();
})
.BuildSessionFactory();
}));
cont.Register(
Component.For(typeof(IClientLookup), typeof(ICountryLookup), typeof(IOtherLookupLookup)).LifeStyle.Transient.ImplementedBy<ABCDataLookup>().DependsOn(
Dependency.OnComponent(typeof(ISessionFactory), "ABC")));
我发现,经过一段时间的正常运行时间(比如,2小时尽可能地推送消息),我有数以千计的ABCDataLookup
组件潜伏在周围,据我所见,只有保留这些组件的东西是Windsor容器(所以,据推测,它仍然认为其他东西正在使用这些组件?)
我的一些问题可能源于NServiceBus负责在容器中注册某些组件和/或执行解决方案,因此我无法清楚地看到注册是否正确。
我的注册中是否存在错误/愚蠢的行为?
我已经做了一件看起来不对的事情:
cont.Register(
Component.For<IWindsorContainer>().Instance(cont));
因为NServiceBus在容器中注册了一个ISessionFactory
以供IFindSagas
实现使用。但我有另一个实现IWantToRunWhenTheBusStarts
的组件想要获得&#34; ABC&#34; ISessionFactory
,我无法解决如何在NServiceBus和Windsor之间进行工作的问题。
期望注入ABCDataLookup
个实例的其他组件是Sagas,而且我再也无法真正看到NServiceBus如何注册/实例化它们。
如果需要显示任何额外的代码或配置,请大声说出来。
我的Packages.config:
<packages>
<package id="Castle.Core" version="3.0.0.4001" targetFramework="net45" />
<package id="Castle.Windsor" version="3.0.0.4001" targetFramework="net45" />
<!-- irrelevant -->
<package id="FluentNHibernate" version="1.3.0.733" targetFramework="net45" />
<package id="Iesi.Collections" version="3.2.0.4000" targetFramework="net45" />
<package id="log4net" version="1.2.10" targetFramework="net45" />
<!-- irrelevant -->
<package id="NHibernate" version="3.3.2.4000" targetFramework="net45" />
<package id="NServiceBus" version="3.3.8" targetFramework="net45" />
<package id="NServiceBus.CastleWindsor" version="3.3.8" targetFramework="net45" />
<package id="NServiceBus.Host" version="3.3.8" targetFramework="net45" />
<package id="NServiceBus.Interfaces" version="3.3.8" targetFramework="net45" />
<package id="NServiceBus.NHibernate" version="3.3.8" targetFramework="net45" />
</packages>
答案 0 :(得分:1)
我们已经修复了在v4中正确处理组件的一些事情,请参阅https://github.com/NServiceBus/NServiceBus/commit/baa9624517d1083e3cfa681e8598f66ccfbf741b
ISessionFactory
也应该作为UoW实施,请参阅我们的内部实施灵感here