[rules-users] NullpointerException in Multithreading at KnowledgeBuilde

Bojan Janisch bojan.janisch at scai.fraunhofer.de
Fri May 31 05:30:03 EDT 2013


Hi everyone,

I'm using Drools in a multithreaded environment where I need to create multiple KnowledgeBuilders, which each contains a different rule. But if I want to add the rule to the builder I'm getting the following exception:
-----------------------------------------------------------------------
Exception in thread "ECJ Evaluation Thread 3" java.lang.NullPointerException
	at org.drools.rule.builder.dialect.mvel.MVELDialect.addStaticPackageImport(MVELDialect.java:416)
	at org.drools.rule.builder.dialect.mvel.MVELDialect.addStaticImport(MVELDialect.java:372)
	at org.drools.compiler.DialectCompiletimeRegistry.addStaticImport(DialectCompiletimeRegistry.java:96)
	at org.drools.compiler.PackageRegistry.addStaticImport(PackageRegistry.java:94)
	at org.drools.compiler.PackageBuilder.processFunctions(PackageBuilder.java:1270)
	at org.drools.compiler.PackageBuilder.processOtherDeclarations(PackageBuilder.java:1225)
	at org.drools.compiler.PackageBuilder.mergePackage(PackageBuilder.java:1220)
	at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:829)
	at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:467)
	at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:673)
	at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:45)
	at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:34)
	at rulevolution.RulEvolution.getSession(RulEvolution.java:195)
	at rulevolution.RulEvolution.runDrools(RulEvolution.java:159)
	at rulevolution.RulEvolution.evaluate(RulEvolution.java:106)
	at ec.simple.SimpleEvaluator.evalPopChunk(SimpleEvaluator.java:259)
	at ec.simple.SimpleEvaluator$SimpleEvaluatorThreadCG.run(SimpleEvaluator.java:341)
	at ec.util.ThreadPool$PoolThread.run(ThreadPool.java:57)
-----------------------------------------------------------------------

I'm getting the same exception in each thread so I only copied thread 3. 
The Code I'm using to initiate my Session is the following:

-----------------------------------------------------------------------
public synchronized StatefulKnowledgeSession getSession(byte[] array){
	KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
	kbuilder.add(ResourceFactory.newByteArrayResource(array), ResourceType.DRL);
		
	KnowledgeBuilderErrors errors = kbuilder.getErrors();

	if (!errors.isEmpty()) {
		for (KnowledgeBuilderError knowledgeBuilderError : errors) {
			logger.log(Level.SEVERE, "error while parsing grammmars in "+knowledgeBuilderError.getResource().toString()+":: "
					+ knowledgeBuilderError.getMessage());
		}
		try {
			throw new Exception();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
	kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
	
	return kbase.newStatefulKnowledgeSession();
}
-----------------------------------------------------------------------

This method is called for each Rule I create one time. The rules are created 
automatically and are syntactically correct, here is an example:

-----------------------------------------------------------------------
import function de.fraunhofer.scai.bio.uima.droolutils.FactChecker.*;
import function de.fraunhofer.scai.bio.uima.droolutils.ODMAnswerManager.*;

global org.apache.uima.util.impl.JSR47Logger_impl log
global org.apache.uima.jcas.JCas aJCas

rule '2'
when
$0: CoreAnnotation(
label_0:getActivityProvenance().toString(),
getConcept().identifierSource.contains('de.cloud4health.odm.eprd.bodySide'))

$1: CoreAnnotation(
label_1:getActivityProvenance().toString(),
getConcept().identifierSource.contains('de.cloud4health.odm.eprd.anatomy'))

$2: NormalizedNamedEntity(
label_2:getConcept().getPrefLabel().value,
getConcept().identifierSource.contains('de.cloud4health.odm.eprd.anatomy'))

eval (hasSameInstance($0, $1, $2))

eval (areEqual($0, $1, $2))

then 
int start = getStart($0,$1,$2);
int ende = getEnd($0,$1,$2);
String attribute = label_0+label_1+label_2;
log.log(Level.FINE, 'Inserted de.cloud4health.odm.eprd.itemGroup.anatomy');
insert(annotate(aJCas, 'de.cloud4health.odm.eprd.itemGroup.anatomy', attribute, start, ende, null, null));
end
-----------------------------------------------------------------------

I appreciate any help. Thank you.

Bojan





More information about the rules-users mailing list