乐趣区

关于java:drools执行完某个规则后终止别的规则执行

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

退出移动版