天天看點

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

目錄

  • 1、背景
  • 2、需求
  • 3、實作方案
    • 1、通過Fact判斷
    • 2、通過全局變量判斷
    • 3、通過halt方法
  • 4、實作上述需求
    • 4.1 drl 檔案編寫
    • 4.2 運作結果
  • 5、完整代碼

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

本文來自部落格園,作者:huan1993,轉載請注明原文連結:https://www.cnblogs.com/huan1993/p/16312292.html