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
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to