3

Drools 4.0.7 で奇妙な動作に遭遇しましたが、Drools がどのように機能するかを理解していないことが原因である可能性があります。「property」というプロパティを持つクラス「A」があるとします。

事実として、次の A のリストがあります: A1、プロパティ = 123 A2、プロパティ = 345 A3、プロパティ = 123

次の2つのルールがあります。

rule "Rule 1 - Remove all A's that have property set to 123"
  salience 1000
  lock-on-active true
when
  $listOfAs : ArrayList collect(A( property == "123" ))
then
  for (Object a: $listOfAs ) {  
      retract (a)
  }
end

rule "Rule 2 - Do stuff with remaining A's"
  salience 900
  lock-on-active true
when
  $listOfAs : ArrayList collect(A())
then
...
end

私の理解では、「ルール 1」は 123 のプロパティを持つクラス A のファクトを削除します。「ルール 2」になると、「listOfAs」に残っている A が 1 つだけであってはなりません (つまり、プロパティが存在するもの)。 「345」に設定)。私が気付いたのは、撤回されていない「A」オブジェクトがまだ 1 つあると想定しているにもかかわらず、「ルール 2」がまったく実行されないことです。「撤回」をコメントアウトすると、「ルール 2」が正常に実行されます。

これらのルールの機能について何か不足していますか?

ありがとう。ジャスティン

4

1 に答える 1

1

ここでの問題は、'lock-on-active' の使用にあると思われます。最初のルールがアクティブ化された場合、他のルールもアクティブ化されなくなります。

docs lock-on-active によると、次のとおりです。

「ブール値。「true」は、同じルールフローまたはアジェンダ グループ内でこのフラグが設定されているすべてのルールの追加のアクティブ化を禁止します。」

于 2013-02-10T16:08:31.880 に答える