[rules-users] Concurrency problem in PackageClassLoader

S_Kumar_P at DELLTEAM.com S_Kumar_P at DELLTEAM.com
Thu Sep 29 02:26:43 EDT 2011


I also was getting this error. I brought out package building logic to execute once, and KnowledgeSession related logic to repeat the required number of times.

Seems there required some delay in preparing rules related classes into one package during iteration and loading the same. Above step was working fine for me.

Pseudo code:

          KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

      // this will parse and compile in one step

      // get the compiled packages (which are serializable)
      Collection<KnowledgePackage> pkgs = null;

      // add the packages to a knowledgebase (deploy the knowledge packages).
      KnowledgeBase kbase = null;

      StatefulKnowledgeSession ksession = null;
          // constructor to be called once
public RuleEngine (byte[] rules) {
            kbuilder.add(ResourceFactory.newByteArrayResource(rules),ResourceType.DRL);
//          Check the builder for errors
            if (kbuilder.hasErrors()) {
                  System.out.println(kbuilder.getErrors().toString());
                  throw new RuntimeException("Unable to compile drl.");
            }
            pkgs = kbuilder.getKnowledgePackages();

            // add the packages to a knowledgebase (deploy the knowledge packages).
            kbase = KnowledgeBaseFactory.newKnowledgeBase();
            kbase.addKnowledgePackages(pkgs);
      }

// this method will be called required number of times
      public void fire(Object obj) {

            ksession = kbase.newStatefulKnowledgeSession();
            ksession.addEventListener(new DebugAgendaEventListener());
            ksession.addEventListener(new DebugWorkingMemoryEventListener());

            // setup the audit logging
            //KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "log/drools.log");

            ksession.insert(obj);

            ksession.fireAllRules();

            //logger.close();

            ksession.dispose();
      }


Check this out.


Thanks & Regards
Santhosh Pallerla

From: rules-users-bounces at lists.jboss.org [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of nicolas
Sent: Thursday, September 29, 2011 8:09 AM
To: rules-users at lists.jboss.org
Subject: [rules-users] Concurrency problem in PackageClassLoader

Hi,

We are using a single (Drools 5.1.1) Stateless Sessions for the parallel processing of thousands of facts.

>From time to time we experienced the following error :

org.drools.runtime.rule.ConsequenceException: rule: Priorite - Groupe: TMK2612G01, P10

      at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
      at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:927)
      at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:856)
      at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1071)
      at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:785)
      at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:751)
      at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:218)
      at acme.srv.ept.service.impl.traitement.MoteurTraitementDemandes.traiterDemande(MoteurTraitementDemandes.java:121)
(...)
Caused by: java.util.ConcurrentModificationException
      at java.util.HashMap$AbstractMapIterator.checkConcurrentMod(Unknown Source)
      at java.util.HashMap$AbstractMapIterator.makeNext(Unknown Source)
      at java.util.HashMap$KeyIterator.next(Unknown Source)
      at java.util.HashMap.analyzeMap(Unknown Source)
      at java.util.HashMap.rehash(Unknown Source)
      at java.util.HashMap.rehash(Unknown Source)
      at java.util.HashMap.putImpl(Unknown Source)
      at java.util.HashMap.put(Unknown Source)
      at org.drools.rule.JavaDialectRuntimeData$PackageClassLoader.loadClass(JavaDialectRuntimeData.java:503)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:609)
      at  acme.srv.ept.regle.Rule_Priorite___Groupe__TMK2612G01__P10_0DefaultConsequenceInvoker.evaluate(Rule_Priorite___Groupe__TMK2612G01__P10_0DefaultConsequenceInvoker.java:29)
      at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:917)
      ... 49 more

We get the same error when we used a pool of Stateless Sessions (serial access) based on the same KnowledgeBase for the processing.


Thanks,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110929/1ed8d709/attachment.html 


More information about the rules-users mailing list