2011-03-10 4 views
0

J'essaie de trouver ce qui semble être un problème de mise en cache et je n'arrive pas à trouver de réponses. Ce que j'ai:NServicebus & NHibernate caching issue

Une série de 5 gestionnaires de messages pour traiter une 'commande' de notre site ASP.NET MVC. Je devrais noter, le comportement noté ci-dessous a été vu quand le processus était un gestionnaire de message. Je l'ai cassé pour le sécher.

Les gestionnaires sont les suivants:

  • OrderCompleteHandler -
  • CreateArtifact1Handler -
  • CreateArtifact2Handler -
  • RESTIntegrationHandler -
  • EMailHandler fait

Le processus fonctionne bien, tout est grand avec une grande mise en garde: Si l'une des données persistantes dans la base de données est modifiée dans le site, les gestionnaires de nservicebus ne voient pas les données réfléchies lors du retraitement des mêmes gestionnaires pour le (s) même (s) enregistrement (s).

Nous avons mis en place un IMessageModule w/le code suivant:

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

Si je redémarre le servicebus, les modifications de données sont correctement reflétées, ce qui me fait (peut-être à tort) à une mauvaise quelque chose configuré dans le côté servicebus.

NServiceBus Configuration:

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(); 

Configuration Web:

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(); 

Ma question est: Que puis-je manqué?

Merci

Répondre

2

NHibernate a des capacités de mise en cache étonnantes avec un cache primaire et secondaire qui couvre à la fois la session en cours, ainsi que l'ensemble du processus. En tant que point de départ, je recommande complètement désactiver toute la mise en cache du tout dans les NHibernate:

How do I totally disable caching in nHibernate?

Si cela fonctionne, vous pouvez sélectivement réactiver la mise en cache pour chaque gestionnaire jusqu'à ce que le problème est complètement isolé. L'idée est d'aller et venir entre la désactivation et la réactivation du cache jusqu'à ce que vous puissiez affiner où exactement le comportement inattendu se produit. Ce que vous décrivez ici semble également transcender NServiceBus. En d'autres termes, si vous utilisiez les services Web WCF ou .NET, vous avez probablement le même comportement.

+0

Je vais devoir essayer. Merci pour le conseil et le lien. Je reviendrai quand je saurai quelque chose. – DevSolo