drools滿足一條規則後不再執行其他規則的解決方案
阿新 • • 發佈:2018-12-27
背景:
配置了了多個規則,規則引擎在執行的時候會將每一個分支都判斷/執行一下一下,假設我們現在有下面兩個規則。
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的功能。麻煩在留言中告知。