2017-08-25 3 views
0

私はDroolsを習得しており、簡単なプログラムを実装しました。しかし、期待どおりの結果は得られません。droolsルールからの予期しない出力

ルール.drlというファイル:メインで

rule "Is of valid age" salience 10 
    when 
     $a: Applicant (getAge() > 18) 
    then 
     $a.setValid(true); 
     System.out.println($a.getName() + " is eligible for driving license!"); 
end 

rule "Can by alcohol" salience 1 
    when 
     $a: Applicant(isValid() == false); 
    then 
     System.out.println($a.getName() + " cannot buy alcohol!"); 
end 

私はsimleの申請オブジェクトを挿入します。

Applicant applicant1 = new Applicant("Berat", 20, 2010); 
kieSession.insert(applicant1); 
kieSession.fireAllRules(); 
System.out.println(applicant1.getName() + " is of valid age: " + applicant1.isValid()); 

私は、このオブジェクトへのすべてのルールを起動すると、出力は次のようになります。

Beratは運転免許の対象となります!
ベラットはアルコールを買うことができません!
ベラトは有効な年齢である:

本当の私が顕現キーワードでルールの優先権を与える、が、「缶アルコールによる」ルールがまだ発射されます。最初のルールではisValid(true)が実行され、2番目のルールではisValid()== falseがfalseを返す必要があるため、パーツを見逃すはずです。

+0

私はこの動作が正しいと考えています。重要度を定義していますので、高性能ルールが最初に実行され、次に別のルールが実行されます。 – mhasan

+0

アプリケーションオブジェクトの年齢が18歳を超えているため、setValid(true) isValid()== falseはfalseを返し、ルールのthen部分は実行されません。 – InstantCrush

答えて

1

声明

$a.setValid(true); 

は、申請者のための真に有効な設定はないが、これはDroolsのルールエンジンに伝播されません。正しい設定を確認するには、他のより低い重要度のルールについては、

modify($a){ setValid(true) } 

が必要です。

事実を取り消すだけで問題が隠されます。

0

私は顕著性が実行順序を定義すると思います。

retract($a)then句の有効年齢ルールで試すことができます。

+0

これは私の問題を解決しました。アドバイスありがとうございます。 – InstantCrush