drools执行完某个规则后终止别的规则执行
1、背景
在我们开发的过程中,可能一个场景需要写多个规则,但是某些规则和别的规则又是互斥的关系。即某个规则成立时,不管其余的规则是否成立,其余的规则都不在执行。
那么这种场景该如何处理呢?
2、需求
假设我们有三个规则 rule-01
、rule-02
和rule-03
,当rule-02
执行后,那么rule-03
必须终止执行。
3、实现方案
1、通过Fact判断
即当rule-02
规则执行后,修改Fact
中的某个属性,设置规则已执行,后续规则发现是已执行则不在执行规则。
2、通过全局变量判断
在drools中使用全局变量进行判断。
3、通过halt方法
【drools执行完某个规则后终止别的规则执行】当我们在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-01
rule-02
可以看到
rule-03
没有输出出来,说明这个规则被终止执行了。5、完整代码 https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-termination-rule
推荐阅读
- 将完整的帖子和来自两种不同帖子类型的4个摘录结合起来
- dolphinscheduler调度中执行python报错的处理过程
- 我如何使wordpress表单操作属性转到主题function.php并在那里执行代码
- win7系统压缩软件如何完成最小压缩的技巧分享
- 迅速完成win7系统修好命令行
- crontab内环境变量问题(crontab定时任务执行脚本异常)
- 索尼笔记本电脑怎样进入Bios,本文教您如何4步完
- 链得得|元宇宙服务商MetaEstate最新完成数百万美元战略轮融资 Matrixport和SevenX Ventures领投
- drools执行指定的规则
- 致命错误(第463行的C:\xampp\htdocs\AKS_Shop\wp-includes\Requests\Transport\cURL.php中超过30秒的最大执行时间)