[rules-users] NullpointerException in Multithreading at KnowledgeBuilde

Davide Sottara dsotty at gmail.com
Fri May 31 05:54:42 EDT 2013


The error has nothing to do with the multiple threads.
There is a small bug in MVELDialect: the "import function" probably
fails and a compilation error would be returned,
but the code tries to use the supposedly imported and resolved class anyway.
I'll open a JIRA.
Thanks
Davide

On 05/31/2013 11:30 AM, Bojan Janisch wrote:
> 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
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



More information about the rules-users mailing list