在我们开发的过程中,可能一个场景需要写多个规则,但是某些规则和别的规则又是互斥的关系。即某个规则成立时,不管其余的规则是否成立,其余的规则都不在执行。那么这种场景该如何处理呢?
假设我们有三个规则 rule-01、rule-02和rule-03,当rule-02执行后,那么rule-03必须终止执行。
即当rule-02规则执行后,修改Fact中的某个属性,设置规则已执行,后续规则发现是已执行则不在执行规则。
在drools中使用全局变量进行判断。
当我们在drl文件中调用drools.halt()方法后,它会立即终止它后面的规则,即后面的规则都不在执行。
此处我们通过halt方法来实现。
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(),说明,该规则执行完之后,它后方激活的规则需要终止执行。
rule-01rule-02可以看到rule-03没有输出出来,说明这个规则被终止执行了。
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-termination-rule