drools執行完某個規則後終止別的規則執行
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、完整程式碼
//gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-termination-rule


