2017-07-06 3 views
2

Nous avons une application Java avec différents modules déployés sur Weblogic. Nous utilisons des drools sur différents modules et essayons de faire de la classe qui initialise le KieContainer un singleton en le définissant comme une classe enum.Drools KieContainer de différents ClassLoader

Cependant, il semble que quand nous sommes dans l'environnement de production (où l'application est déployée dans un fichier d'oreille), il existe différentes classloaders d'initialisation de cette classe et nous obtenons l'exception suivante:

null java.lang.IllegalStateException: There's already another KieContainer created from a different ClassLoader; 
at org.drools.compiler.kie.builder.impl.KieServicesImpl.getKieClasspathContainer(KieServicesImpl.java:88); 
at org.drools.compiler.kie.builder.impl.KieServicesImpl.getKieClasspathContainer(KieServicesImpl.java:73); 

-vous avoir des suggestions sur la façon de résoudre ce problème?

Répondre

1

Nous avons eu le même problème mais dans un environnement différent (Kafka, Weld SE). Bien que contre-intuitif, invoquant

// Answer the cuurent container if it exists else create a new container 
KieServices.Factory.get().getKieClasspathContainer() 

pas

// Always create a new container 
KieServices.Factory.get().newKieClasspathContainer() 

fixe la plupart des choses pour nous.

Aussi, avant que le conteneur est hors de portée assurez-vous d'invoquer KieServices.Factory.get(). GetKieClasspathContainer(). Disposer() pour libérer le conteneur et ses ressources de la singleton mondiale Drools. Nous avons également eu des problèmes pour exécuter des tests unitaires dans Maven car le plugin Surefire ne recréera pas par défaut une JVM par test alors que Drools suppose qu'une instance de son singleton global sera créée une seule fois par appel JVM. Ceci est résolu en ayant Surefire recréer un environnement JVM propre par test. Ajustez votre pom.xml en ajoutant

<reuseForks>false</reuseForks> 

à votre configuration Surefire. Par exemple:

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>default-test</id> 
      <configuration> 
       <reuseForks>false</reuseForks> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 

En outre, vous pourriez envisager d'attribuer chaque module Java EE son propre KieContainer

KieContainer getKieClasspathContainer(String containerId); 

Cela permettrait au cycle de vie de chaque module Java EE à synchroniser à celle de chaque Drools module de conteneur .