NServicebus & NHibernate проблема кэширования - PullRequest
0 голосов
/ 10 марта 2011

Я пытаюсь отследить проблему кеширования и не могу найти никаких ответов. Что у меня есть:

Серия из 5 обработчиков сообщений для обработки «заказа» с нашего сайта ASP.NET MVC. Я должен отметить, что поведение, отмеченное ниже, было замечено, когда процесс был одним обработчиком сообщений. Я сломал это, чтобы высушить это.

Обработчики следующие:

  • OrderCompleteHandler до
  • CreateArtifact1Handler до
  • CreateArtifact2Handler до
  • RESTIntegrationHandler до
  • EMailHandler сделано

Процесс работает отлично, все замечательно с одним большим предупреждением: если на сайте изменяются какие-либо постоянные данные в базе данных, обработчики nservicebus не видят отраженные данные при повторной обработке одних и тех же обработчиков для тех же самых запись (s).

Мы внедрили IMessageModule со следующим кодом:

public void HandleBeginMessage()
{
   CurrentSessionContext.Bind(SessionFactory.OpenSession());
}

Если я перезагружаю сервисную шину, изменения данных корректно отражаются, что указывает мне (возможно, неправильно) на что-то неправильно настроенное на стороне сервисной шины.

Конфигурация NServiceBus:

 return Fluently.Configure()
    .Database(
       MsSqlConfiguration.MsSql2005
          .CurrentSessionContext( "NHibernate.Context.ThreadStaticSessionContext, NHibernate" )
          .ConnectionString(c => c.FromAppSetting("connection.string"))
          .ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle")
          .ShowSql())
    .Mappings(m =>
    {
       m.FluentMappings.AddFromAssemblyOf<UserMapping>();
       m.FluentMappings.Conventions.AddFromAssemblyOf<EnumConvention>();
    })
    .ExposeConfiguration(cfg =>
    {
       cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new AuditLogEventListener() };
       cfg.EventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] { new AuditLogEventListener() };
       cfg.SetProperty("cache.provider_class", "NHibernate.Cache.HashtableCacheProvider");
       cfg.SetProperty("cache.use_second_level_cache", "true");
       cfg.SetProperty("cache.use_query_cache", "true");
    } )
    .BuildSessionFactory();

Веб-конфигурация:

return Fluently.Configure()
    .Database(
        MsSqlConfiguration.MsSql2005
           .Cache(c => c
              .UseQueryCache()
              .ProviderClass<SysCacheProvider>() )
           .CurrentSessionContext("NHibernate.Context.ManagedWebSessionContext, NHibernate")
           .ConnectionString(c => c
              .FromAppSetting("connection.string"))
           .ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle")
           .ShowSql())
    .Mappings(m =>
    {
        m.FluentMappings.AddFromAssemblyOf<UserMapping>();
        m.FluentMappings.Conventions.AddFromAssemblyOf<EnumConvention>();
    })
    .ExposeConfiguration(cfg =>
    {
        cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new AuditLogEventListener() };
        cfg.EventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] {new AuditLogEventListener()};
    })
    .BuildSessionFactory();

Мой вопрос: что я мог пропустить?

Спасибо

1 Ответ

2 голосов
/ 10 марта 2011

NHibernate обладает удивительными возможностями кеширования с первичным и вторичным кешем, охватывающим как текущий сеанс, так и весь процесс. В качестве отправной точки я бы рекомендовал полностью отключить любое кэширование в NHibernate:

Как полностью отключить кэширование в nHibernate?

Если это работает, вы можете выборочно включить кэширование для каждого обработчика, пока проблема не будет полностью изолирована. Идея состоит в том, чтобы переключаться между отключением и повторным включением кэша, пока вы не сможете определить, где именно происходит непредвиденное поведение.

То, что вы здесь описываете, похоже, выходит за пределы NServiceBus. Другими словами, если вы использовали веб-сервисы WCF или .NET, вы, вероятно, испытываете такое же поведение.

...