目錄
- 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