0

以下のルールでは、各 clazz1 に対して最初に rule1 を実行し、それが満たされた場合にのみ、他のルールを実行する必要があります ( lock-on-active のため)。

ただし、rule1 が実行された後、drools は rule1、rule2、rule3、および rule2、rule3 を実行してから、rule1 に戻ります。

私の設定が間違っているかどうか教えていただけますか?

rule "rule1"
ruleflow-group "validate_precondition"
    when
        $clazz1 : Clazz1 ( isPreConditionSatisfied() )
    then
        drools.setFocus("validate1");
end

rule "rule2"
agenda-group "validate1"
lock-on-active true
    when
        $clazz1 : Clazz1 ( !isCheck1(type) )
    then
        System.out.println("inside check1");
end

rule "rule3"
agenda-group "validate1"
lock-on-active true
    when
        $clazz1 : Clazz1 ( !isCheck2(type) )
    then
        System.out.println("inside check2");
end
4

1 に答える 1

1

Drools マニュアルから:

ruleflow-group がアクティブになるか、アジェンダ グループがフォーカスを受け取るたびに、lock-on-active が true に設定されているそのグループ内のルールはアクティブ化されなくなります ... アジェンダ グループがフォーカスを失うと、それらのルールlock-on-active を true に設定すると、それらのアクティベーションがアジェンダに配置される資格が再び得られます。

したがって、各ルールが異なるアジェンダ グループにあり、各ルールのアクティブ化後にフォーカスを変更する場合、lock-on-active を使用しても何も達成されません。

おっしゃる通り、ルールエンジンが複数回起動しているようです。無限ループで循環していないと仮定すると、これは、作業メモリ内の Clazz1 の複数のインスタンスが原因であると予想されます。

無限ループで循環している場合、上記のコードが実行しているものではないと推測する危険があります。このような状況での無限ループは、「ループなし」を使用せずにファクトを更新するルールによって引き起こされる傾向があります。

1 つ追加の注意事項 - これらの規則の実行に命令を強制することが適切かどうかを真剣に再検討する必要があります。少なくとも上記の例では、これを行う正当な理由はないようです。

于 2013-10-28T19:19:40.873 に答える