我不确定这是NServiceBus问题,Windsor问题还是我自己的愚蠢问题 - 但是我正在经历内存泄漏,这似乎指向大量瞬态组件仍然在四处闲逛。不处置瞬态组件的容器
这是我如何设置NServiceBus与温莎,我IWantCustomInitialization.Init
方法中:
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
组件的虎视眈眈,到目前为止,我所看到的,持有到这些部件的唯一事情就是温莎容器(因此,据推测,它仍然认为一些人在使用这些组件?)
我的一些问题可能来自t事实上NServiceBus负责在容器中注册一些组件并且/或者执行解决方案,所以我无法清楚地看到注册是否正确。
有没有什么我做错了/我的注册愚蠢?
我已经有做一两件事,看起来错误:
cont.Register(
Component.For<IWindsorContainer>().Instance(cont));
因为NServiceBus通过IFindSagas
实现登记在使用的容器一个ISessionFactory
。但我有另一个组件,实现IWantToRunWhenTheBusStarts
,想要获得“ABC”ISessionFactory
,我无法弄清楚如何使NServiceBus和温莎之间的工作。
其他预计会有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>
您是否阅读过此内容:http://devlicio.us/blogs/krzysztof_kozmic/archive/2010/08/27/must-i-release-everything-when-using-windsor.aspx – Marwijn
@ Marwijn--我读过它,但恐怕没有给我任何见解。 –
你能检查针对ABCDataLookup实例的Sagas实例的数量吗?如果它匹配,那么它是萨格斯责备举行参考,而不是温莎容器 –