2017-09-27 5 views
0

私は単純なDroolsプロジェクトを作成しました。 すべてが正常に動作しますが、私のルールは1回ではなく2回実行されます。Drools:ステートレスセッションで2回実行される単純ルール

私のルールを確認してください:

package rules 

rule "age and type match" 
    when 
     $droolsIntro : rules.DroolsInstruction(type == "Manager") && rules.DroolsInstruction(age >= 20) 
    then 
     System.out.println("age and type match"); 
     System.out.println($droolsIntro.introduceYourself()); 
    end 

コードを確認してください:

List<DroolsInstruction> facts = new ArrayList<DroolsInstruction>(); 
DroolsInstruction object3 = new DroolsInstruction("Manager", 25); 
DroolsInstruction object4 = new DroolsInstruction("Policeman", 31); 
facts.add(object3); 
facts.add(object4); 
DroolsDynamicJar drools = new DroolsDynamicJar(); 
StatelessKieSession kSession = drools.getStatelessSessionWithJar(); 
kSession.execute(facts); 

そしてここでは、ルールが同じオブジェクトに対して2回実行されたことを示して出力されます

年齢と一致する マネージャー、25、偽

年齢と型が一致 マネージャー、25、偽

なぜ?

答えて

2

このパターン

DroolsInstruction(type == "Manager") 
DroolsInstruction(age >= 20) 

は、エンティティ「マネージャー」と年齢> = 20のいずれかに一致するが、その関係についてどのような制約がありません。したがって、25歳のマネージャは最初のパターンと2番目のパターンに一致します。しかし、同じマネージャーが最初のパターンと一致し、古い警官が2番目のパターンと一致します。

古い管理職を探したい場合は、状況(および推奨されません)

$di1: DroolsInstruction(type == "Manager")            
$di2: DroolsInstruction(this == $di1, age >= 20) 

も働くでしょうが、あなたはより良い

DroolsInstruction(type == "Manager", age >= 20) 

を書きます。

+0

ありがとうございました!説明をありがとう、laune、それは私がこれを得るために簡単ではなかった:) – MiamiBeach

関連する問題