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