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());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