3

我不确定这更多的是 NServiceBus 问题、Windsor 问题还是我自己的愚蠢问题 - 但我遇到了内存泄漏,这似乎表明许多临时组件仍然存在。

这就是我在方法中使用 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组件潜伏在周围,据我所知,唯一保留这些组件的是温莎容器(所以,大概,它仍然认为其他东西正在使用这些组件?

我的一些问题可能源于 NServiceBus 负责在容器中注册某些组件和/或执行解析,因此我无法清楚地查看注册是否正确。

我在注册时做错了什么/愚蠢的事情吗?

我已经不得不做一件看起来不对的事情:

cont.Register(
    Component.For<IWindsorContainer>().Instance(cont));

因为 NServiceBusISessionFactory在容器中注册了一个以供IFindSagas实现使用。但是我有另一个实现IWantToRunWhenTheBusStarts想要获得 "ABC" 的组件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>
4

1 回答 1

1

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

ISessionFactory应该作为 UoW 实施,请参阅我们的内部实施以获得灵感

于 2013-06-21T08:57:19.757 回答