5

drools执行完某个规则后终止别的规则执行 - huan1993

 2 years ago
source link: https://www.cnblogs.com/huan1993/p/16312292.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在我们开发的过程中,可能一个场景需要写多个规则,但是某些规则和别的规则又是互斥的关系。即某个规则成立时,不管其余的规则是否成立,其余的规则都不在执行。那么这种场景该如何处理呢?

假设我们有三个规则 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK