リファレンス salience

ルールを複数定義上記すると同じ条件でマッチするときがあります。デフォルトはLIFO方式なのでルール定義を下に宣言したものからマッチングされます。

たとえば

rule "rule-1"
    when
    	Person()
    then     
        System.out.println("rule-1");
end  

rule "rule-2"
    when
    	Person()
    then     
        System.out.println("rule-2");
end

としてPersonオブジェクトをインスタンス化してDroolsに渡して実行するとrule-2->rule-1の順でコンソール出力されます。そこで優先順位を持たせたいと
きには「salience」を宣言します。値を添えて宣言して、その値が大きいほど優先順位も高くなります。

rule "rule-1"
    salience 2
    when
    	Person()
    then     
        System.out.println("rule-1");
end  

rule "rule-2"
    salience 1
    when
    	Person()
    then     
        System.out.println("rule-2");
end

これで実行するとrule-1->rule-2の順で出力されます。こういう風に固定値でsalienceも宣言できますが、動的にすることも可能です。たとえば

import com.sample.Person;

rule "padawan"
    salience 30 #平均年齢
    when
    	$p : Person()
    then     
        System.out.println("まだまだひよっこだなぁ");
        retract($p);
end  

rule "jedi"
    salience ($p.age * 2)
    when
    	$p : Person()
    then     
        System.out.println("もう立派なJEDIや");
        retract($p);

end

とルールを書いてPersonオブジェクトのageが10才だと「まだまだひよっこだなぁ」が出力されます。20才だと、jediルールのsalienceの値が40になるのでこっちを先にマッチングするようになるので「もう立派なJEDIや」と出力されます。複雑な計算と重みづけを簡単に宣言できる、といったところですかね。あ、retractはルールエンジンから対象オブジェクト(ファクト)を取り除くこと(つまりルールマッチングでもう使わない)を意味しています。