2

droolsを実行しているjbossインスタンスのクラスターがあります。1つのインスタンスでナレッジベースを生成し、それをデータベースに保存します。他のインスタンスは、それを自分で生成する代わりに、データベースからロードできます。

これは、drools 4を使用してしばらくの間はうまく機能していましたが、最近drools 5.3.0 BRMSにアップグレードしたため、パターンが機能しなくなりました。KnowledgeBaseは、それが生成されたアプリインスタンス内では正常に機能しますが、次の例外を除いて、他のすべての場所で失敗します。この例外は、ファクトを作業メモリーに挿入したときに発生することに注意してください。

アプリのすべてのインスタンスは同一であり、同じjvmなどで実行されます。「other」インスタンスは別の物理マシン上にある必要はありません。同じハードウェア上にある可能性がありますが、それでも障害は発生します。

生成されたものとは異なるjvmインスタンスで失敗するKnowledgeBaseについてはどうですか?この問題を回避する方法はありますか?ありがとう。

これは、障害が発生しているように見える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