drools執行完某個規則後終止別的規則執行

huan1993發表於2022-05-26

1、背景

在我們開發的過程中,可能一個場景需要寫多個規則,但是某些規則和別的規則又是互斥的關係。即某個規則成立時,不管其餘的規則是否成立,其餘的規則都不在執行。那麼這種場景該如何處理呢?

2、需求

假設我們有三個規則 rule-01rule-02rule-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

相關文章