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

juancarlos.fernandezj juancarlos.fernandez at safelayer.com
Thu Oct 6 07:28:46 EDT 2011


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.



More information about the rules-users mailing list