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());endrule "rule-02"    salience 2    when    then        System.out.println(drools.getRule().getName());        // 终止下方的 "rule-03" 规定的执行        drools.halt();endrule "rule-03"    salience 1    when    then        System.out.println(drools.getRule().getName());end

上述的规定比较简单,通过salience设置规定的优先级,值越大优先级越高。when前面没有条件,阐明规定都会通过模式匹配,即都可能会执行。然而rule-02规定的then局部有drools.halt(),阐明,该规定执行完之后,它前方激活的规定须要终止执行。

4.2 运行后果

rule-01rule-02

能够看到rule-03没有输入进去,阐明这个规定被终止执行了。

5、残缺代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-termination-rule