1、背景
在我們開發的過程中,可能一個場景需要寫多個規則,但是某些規則和別的規則又是互斥的關係。即某個規則成立時,不管其餘的規則是否成立,其餘的規則都不在執行。
那麼這種場景該如何處理呢?
2、需求
假設我們有三個規則 rule-01
、rule-02
和rule-03
,當rule-02
執行後,那麼rule-03
必須終止執行。
3、實現方案
1、通過Fact判斷
即當rule-02
規則執行後,修改Fact
中的某個屬性,設定規則已執行,後續規則發現是已執行則不在執行規則。
2、通過全域性變數判斷
在drools中使用全域性變數進行判斷。
3、通過halt方法
當我們在drl
檔案中呼叫drools.halt()
方法後,它會立即終止它後面的規則,即後面的規則都不在執行。
此處我們通過halt
方法來實現。
4、實現上述需求
4.1 drl 檔案編寫
package rules
/**
需求:在 "rule-01" 和 "rule-02" 規則執行完之後,終止規則 "rule-03" 的執行
*/
rule "rule-01"
salience 3
when
then
System.out.println(drools.getRule().getName());
end
rule "rule-02"
salience 2
when
then
System.out.println(drools.getRule().getName());
// 終止下方的 "rule-03" 規則的執行
drools.halt();
end
rule "rule-03"
salience 1
when
then
System.out.println(drools.getRule().getName());
end
上述的規則比較簡單,通過salience
設定規則的優先順序,值越大優先順序越高。when
後面沒有條件,說明規則都會通過模式匹配,即都可能會執行。但是rule-02
規則的then
部分有drools.halt()
,說明,該規則執行完之後,它後方啟用的規則需要終止執行。
4.2 執行結果
rule-01
rule-02
可以看到rule-03
沒有輸出出來,說明這個規則被終止執行了。
5、完整程式碼
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-termination-rule