1. 程式人生 > >drools滿足一條規則後不再執行其他規則的解決方案

drools滿足一條規則後不再執行其他規則的解決方案

 

背景:

配置了了多個規則,規則引擎在執行的時候會將每一個分支都判斷/執行一下一下,假設我們現在有下面兩個規則。

rule "prize12221112"
when
    $student: Student(score >= 99)
then
    $student.getPrize().add("phone");
    System.out.println("score >= 99" + $student.getPrize().get(0));
end


rule "prize12221112"
when
    $student: Student(score >= 90)
then
    $student.getPrize().add("phone");
    System.out.println("score  >= 90" + $student.getPrize().get(0));
end

規則的含義是學生分數大於99,給一個手機作為獎勵;大於90,給一個手機作為獎勵。

如果學生分數是100,經過規則引擎後,會有兩個手機,這不是產品想要的結果。

怎麼保證只得到一個手機?

或者說是當一個規則滿足並且執行結果後,其他規則不再生效?

下面是我的解決方案:

rule "prize12221112"
when
    $student: Student(result!=1,score >= 99)
then
    $student.getPrize().add("phone");
    System.out.println("score >= 99" + $student.getPrize().get(0));
    $student.setResult(1);
    update($student);
end

rule "prize12221112"
when
    $student: Student(result!=1,score >= 90)
then
    $student.getPrize().add("phone");
    System.out.println("score  >= 90" + $student.getPrize().get(0));
    $student.setResult(1);
    update($student);
end

由於這兩個規則的優先順序沒有設定,先走哪一個規則判斷是隨機的,不管先走哪個,最後都設定一個標識,表示已經有結果了,然後進行下一個規則判斷的時候就過不去規則。

這裡需要注意的是,雖然我有  $student.setResult(1);但是隻有呼叫下面的update方法,才會將更新的值載入到規則引擎的記憶體中。

 update($student);

 



另外:

這個方法不太好,因為其他的規則還是會進行判斷,不知道誰找到更好的解決方案,類似break或者return的功能。麻煩在留言中告知。