2

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

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

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

知识库为何会在与生成它的 jvm 实例不同的 jvm 实例中失败?有没有办法避免这个问题?谢谢。

这是似乎发生故障的 drl。我已经通过mvel代码做了一些调试,但我对它并不熟悉,我还没有弄清楚发生了什么。我认为发生故障的表达式是“this.fact.requirementId”。

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)
4

0 回答 0