当前位置: 首页 > 后端技术 > Java

Drools在执行某条规则后终止其他规则的执行

时间:2023-04-02 00:59:12 Java

1。背景在我们开发的过程中,我们可能需要为一个场景编写多个规则,但有些规则与其他规则是相互排斥的。即当某条规则成立时,无论其余规则是否成立,其余规则均不执行。那么如何处理这种情况呢?2.要求假设我们有三个规则,rule-01、rule-02和rule-03。执行rule-02时,必须终止rule-03。三、实现方案1、Fact判断,即rule-02规则执行后,修改Fact中的某个属性,设置要执行的规则,如果发现后续规则要执行,则该规则会不被执行。2.通过全局变量判断使用drools中的全局变量来判断。3、通过halt方法当我们调用drl文件中的drools.halt()方法时,它会立即终止其后面的规则,即后面的规则不会被执行。这里我们使用halt方法来实现。4.实现以上需求4.1在drl文件中写包规则/**需求:“rule-01”和“rule-02”规则执行后,终止执行规则“rule-03”*/rule”rule-01"salience3whenthenSystem.out.println(drools.getRule().getName());endrule"rule-02"salience2whenthenSystem.out.println(drools.getRule().getName());//终止下面“rule-03”规则的执行drools.halt();endrule"rule-03"salience1whenthenSystem.out.println(drools.getRule().getName());end以上rules比较简单,通过salience设置rule的优先级,值越大优先级越高。当when后面没有condition时,表示规则将通过模式匹配,即可以执行。但是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