「DroolsRulesEngine」:ロックオンアクティブとノーループの違い



Drools Rules Engine



転載元:https://blog.csdn.net/wo541075754/article/details/104446941

変更または更新を使用すると、ある程度無限ループが発生します。



昨日、クラスメートがDroolsルールエンジンを使用しているときにこの問題に遭遇しました。学生が投稿したルールコードは次のとおりです。




Droolsルールエンジンエンドレスループ
まず、上記のコードを分析してみましょう。上記のコードでは、クラスメートは同じマップを話し、それを2つのルールに渡します。ルールのthen部分では、マップの属性値が更新されます。無限ループを防ぐために、彼はno-loop属性を使用しました。

しかし、問題はまだ存在します。どうして?実際、これはno-loopで使用される関数に関連しています。 no-loopの役割は、modifyなどの更新操作によるルールの繰り返し実行を制限することですが、現在のルールを更新すると、現在のルールが繰り返し実行されるという制限条件があります。他のルールが同じファクトオブジェクトを更新するのを防ぐ代わりに、現在のルールを更新します。

したがって、上記の問題については、現在のルール自体によって引き起こされた更新を解決するだけでなく、他のルール更新ファクトオブジェクトによって引き起こされた更新も解決する必要があります。このとき、lock-on-activetrue属性構成も使用する必要があります。



lock-on-active true属性は、現在のルールの繰り返し実行がそれ自体によってトリガーされないことを含め、現在のルールが1回だけ実行されるように制限できます。これは、no-loopの拡張バージョンです。

さらに、このコードの準備のために、この学生はまた別の間違いを犯しました。それはいつの判断条件です。両方のルールで2つの判断条件が使用されます。 $ map:Map()は判定条件と同等ですMap(...)は判定条件と同等です。実際、これら2つの判断条件は、次の形式のように1つに組み合わせる必要があります:$ map:Map(...)。使用中に同様の間違いをしないように、誰もが注意する必要があります。