drools 5:跨流程共享知识库时出现NullPointerException

drools 5:跨流程共享知识库时出现NullPointerException,drools,mvel,Drools,Mvel,我们有一个运行drools的jboss实例集群。我们在一个实例上生成知识库,然后将其存储在数据库中;然后,其他实例可以从数据库加载它,而不是自己生成它 这在使用drools 4时已经运行了一段时间,但我们最近升级到drools 5.3.0 BRMS,该模式不再有效。KnowledgeBase在生成它的应用程序实例中运行良好,但在其他任何地方都会失败,只有以下例外。请注意,此异常发生在将事实插入工作内存时 应用程序的所有实例都是相同的,它们在相同的jvm中运行,等等。“其他”实例不需要位于不同的物

我们有一个运行drools的jboss实例集群。我们在一个实例上生成知识库,然后将其存储在数据库中;然后,其他实例可以从数据库加载它,而不是自己生成它

这在使用drools 4时已经运行了一段时间,但我们最近升级到drools 5.3.0 BRMS,该模式不再有效。KnowledgeBase在生成它的应用程序实例中运行良好,但在其他任何地方都会失败,只有以下例外。请注意,此异常发生在将事实插入工作内存时

应用程序的所有实例都是相同的,它们在相同的jvm中运行,等等。“其他”实例不需要位于不同的物理机器上——它可以位于相同的硬件上,故障仍然会发生

知识库是什么让它在与生成它的jvm实例不同的jvm实例中失败的?有没有办法避免这个问题?谢谢

这是发生故障的drl。我已经通过mvel代码进行了一些调试,但我不熟悉它,也没有弄清楚到底发生了什么。我认为失败发生的表达方式是“this.fact.requirementd”

rule "Find OutOfOrder PredicateSolutions for new LeafPredicateSolution in rule [Become Application Expired : 147]"
ruleflow-group "RuleGroup[Become Application Expired:147]"
agenda-group "leaf"
no-loop
salience -1001
when
    EngineDates($rewindToDate: engineEffectiveDate);

    lps:LeafPredicateSolution(
        ruleId==147,
        parent==null,
        $candidateId:candidateId,
        defunct==false,
        fact:fact,
        effectiveDate == $rewindToDate,
        $programId:programId,
        eval(!fact.getReused())); // only solutions created for the fact we're running on can trigger OoO


  oops : ArrayList() from accumulate(
    PredicateSolution(
      $sol:this,
      candidateId==$candidateId,
      effectiveDate > $rewindToDate,
      defunct==false,
      programId==$programId,
      parent!=null,
      solutionType!=SolutionType.RETIRED,
      eval(($sol instanceof LeafPredicateSolution) || ($sol instanceof NonCalcProgramSolutionChild))
    ),
    init(ArrayList items = new ArrayList();),
    action(items.add($sol);),
    reverse(items.remove($sol);),
    result(items));
    // Find ProgramPredicateSolutions in other programs that refer to this program.
    // These need to be rewound.
    oopps:ArrayList() from collect(
        ProgramPredicateSolution(
            this.fact.requirementId == $programId,
            candidateId==$candidateId,
            effectiveDate > $rewindToDate,
            defunct==false,
            parent!=null,
            solutionType!=SolutionType.RETIRED));

    eval((oops.size() > 0) || (oopps.size() > 0));

    eval(predicateSolutionFactory.oopEnabled());//Don't run oop if it is disabled (TimeMachine, Whatif)

then
    predicateSolutionFactory.addToOutOfOrder(lps, oops, oopps, new Long(65));
end
堆栈跟踪:

java.lang.NullPointerException
        at org.mvel2.MVEL.executeExpression(MVEL.java:954)
        at org.drools.base.extractors.MVELClassFieldReader.getValue(MVELClassFieldReader.java:100)
        at org.drools.base.extractors.BaseObjectClassFieldReader.getHashCode(BaseObjectClassFieldReader.java:196)
        at org.drools.core.util.AbstractHashTable$DoubleCompositeIndex.hashCodeOf(AbstractHashTable.java:616)
        at org.drools.core.util.RightTupleIndexHashTable.getOrCreate(RightTupleIndexHashTable.java:451)
        at org.drools.core.util.RightTupleIndexHashTable.add(RightTupleIndexHashTable.java:332)
        at org.drools.reteoo.AccumulateNode.assertObject(AccumulateNode.java:263)
        at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:458)
        at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:386)
        at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:135)
        at org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:59)
        at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:135)
        at org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:59)
        at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:135)
        at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:458)
        at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:376)
        at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:214)
        at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:244)
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:337)
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:298)
        at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:887)
        at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:846)
        at org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:267)