Re: [rules-users] ksession.insert() executes sequentially in multithreaded StatefulKnowledgeSessions

2011-10-27 Thread Marco Rietveld
Hi Juan Carlos,

Sorry for the late reply.

Would you mind sending me the Sample.drl en .bpmn files as well?

I happen to have a bit of code that I can use to look into this.

Thanks,
Marco

10/06/2011 01:28 PM, juancarlos.fernandezj:
 Hello,

 I'm having trouble when trying to insert() facts inside parallel
 StatefulKnowledgeSessions. From a main() java program I start multiple
 threads. Every thread creates new KnowledgeBase and every KnowledgeBase
 creates new StatefulKnowledgeSession so I have one StatefulKnowledgeSession
 in every thread. Once StatefulKnowledgeSession has been created, I insert
 lots of facts in each StatefulKnowledgeSession.

 What was expected? I expected to run insert() in parallel, each insert
 inside its thread StatefulKnowledgeSession. 4 threads inserting lots of
 facts inside its own StatefulKnowledgeSession is expected to run in parallel
 and see how CPU usage increases.

 What have I seen? when all threads are inserting facts in its own
 StatefulKnowledgeSession I can see that only one CPU is being used so there
 is no parallel insertion in different StatefulKnowledgeSession.

 Is there a synchronization inside insert() code? It's so strange. Even if i
 try with 12 threads, I can't see a CPU usage increase when executing
 parallel insert() inside different StatefulKnowledgeSession (threads).

 Help please.

 This is my thread code (no static objects):

 public class KnowledgeSessionThread extends Thread {
   
   private StatefulKnowledgeSession session;
   private Message[] facts;
   
  public KnowledgeSessionThread(Message[] facts) throws Exception {
   session = readKnowledgeBase().newStatefulKnowledgeSession();
   this.facts = facts;
  }

  public void run() {
   try {
   for( int i = 0; i  facts.length; i++ ) {
   session.insert(facts[i]);
   }
   session.startProcess(flowId);
   session.fireAllRules();
   session.dispose();
   System.out.println(Thread finished);
   } catch( Exception e ) {
   e.printStackTrace();
   }
  }

  private KnowledgeBase readKnowledgeBase() throws Exception {
  KnowledgeBuilder kbuilder =
 KnowledgeBuilderFactory.newKnowledgeBuilder();
  kbuilder.add(ResourceFactory.newClassPathResource(Sample.drl),
 ResourceType.DRL);
  kbuilder.add(ResourceFactory.newClassPathResource(Sample.bpmn),
 ResourceType.BPMN2);
  KnowledgeBuilderErrors errors = kbuilder.getErrors();
  if (errors.size()  0) {
  for (KnowledgeBuilderError error: errors) {
  System.err.println(error);
  }
  throw new IllegalArgumentException(Could not parse
 knowledge.);
  }
  KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
  kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
  return kbase;
  }
 }

 --
 View this message in 
 context:http://drools.46999.n3.nabble.com/ksession-insert-executes-sequentially-in-multithreaded-StatefulKnowledgeSessions-tp3399339p3399339.html
 Sent from the Drools: User forum mailing list archive at Nabble.com.
 ___
 rules-users mailing list
 rules-users@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/rules-users


-- 
jBPM/Drools developer
Utrecht, the Netherlands

___
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users


[rules-users] ksession.insert() executes sequentially in multithreaded StatefulKnowledgeSessions

2011-10-06 Thread juancarlos.fernandezj
Hello,

I'm having trouble when trying to insert() facts inside parallel
StatefulKnowledgeSessions. From a main() java program I start multiple
threads. Every thread creates new KnowledgeBase and every KnowledgeBase
creates new StatefulKnowledgeSession so I have one StatefulKnowledgeSession
in every thread. Once StatefulKnowledgeSession has been created, I insert
lots of facts in each StatefulKnowledgeSession.

What was expected? I expected to run insert() in parallel, each insert
inside its thread StatefulKnowledgeSession. 4 threads inserting lots of
facts inside its own StatefulKnowledgeSession is expected to run in parallel
and see how CPU usage increases.

What have I seen? when all threads are inserting facts in its own
StatefulKnowledgeSession I can see that only one CPU is being used so there
is no parallel insertion in different StatefulKnowledgeSession.

Is there a synchronization inside insert() code? It's so strange. Even if i
try with 12 threads, I can't see a CPU usage increase when executing
parallel insert() inside different StatefulKnowledgeSession (threads).

Help please.

This is my thread code (no static objects):

public class KnowledgeSessionThread extends Thread {

private StatefulKnowledgeSession session;
private Message[] facts;

public KnowledgeSessionThread(Message[] facts) throws Exception {
session = readKnowledgeBase().newStatefulKnowledgeSession();
this.facts = facts;
}

public void run() {
try {
for( int i = 0; i  facts.length; i++ ) {
session.insert(facts[i]);
}
session.startProcess(flowId);
session.fireAllRules();
session.dispose();
System.out.println(Thread finished);
} catch( Exception e ) {
e.printStackTrace();
}
}

private KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder =
KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(Sample.drl),
ResourceType.DRL);
kbuilder.add(ResourceFactory.newClassPathResource(Sample.bpmn),
ResourceType.BPMN2);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size()  0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException(Could not parse
knowledge.);
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
}

--
View this message in context: 
http://drools.46999.n3.nabble.com/ksession-insert-executes-sequentially-in-multithreaded-StatefulKnowledgeSessions-tp3399339p3399339.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
___
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users