2013-06-13 34 views
3

我不确定这是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> 
+0

您是否阅读过此内容:http://devlicio.us/blogs/krzysztof_kozmic/archive/2010/08/27/must-i-release-everything-when-using-windsor.aspx – Marwijn

+0

@ Marwijn--我读过它,但恐怕没有给我任何见解。 –

+0

你能检查针对ABCDataLookup实例的Sagas实例的数量吗?如果它匹配,那么它是萨格斯责备举行参考,而不是温莎容器 –

回答

1

我们已经确定了不少事情要做正确的V4组件的配置,请参阅https://github.com/NServiceBus/NServiceBus/commit/baa9624517d1083e3cfa681e8598f66ccfbf741b

另外,ISessionFactory应该被实现为UOW,见我们的内部实施灵感here

+0

你能指点我的错误(s )会导致问题吗? –

+0

我们已经修复了很多与在v4中正确处置组件有关的问题,请参阅https://github.com/NServiceBus/NServiceBus/commit/baa9624517d1083e3cfa681e8598f66ccfbf741b –