网站首页 > 开源技术 正文
一、背景
在我们编写drools规则的过程中,可能会发生死循环,那么该怎么解决呢?如果想某一个规则只执行一次,即别的规则导致该规则重新执行,也不需要执行,那么该怎么解决呢?
二、解决方案
针对以上问题,我们可以使用no-loop和lock-on-active来解决,那么他们又有什么不同呢?此处我说一下我的理解。
- no-loop:可以理解为它只针对当前规则生效,如果当前规则的RHS部分发生了变更,导致当前规则触发,那么它不会在执行。
- lock-on-active:这个一般和agenda-group或ruleflow-group结合使用,它可以保证当前规则只执行一次,如果下方别的规则导致该规则重新符合执行条件,则也不会执行,而(no-loop)会重新执行。
- lock-on-active可以理解为增强的no-loop。
三、需求
规则一:如果用户的信用分 < 80则认为用户是黑名单用户。
规则二:如果用户是黑名单用户,则直接修改用户的信用分为60。
四、实现
1、no-loop结果
结论: 从上图中可以看出,虽然规则no_loop_rule_01上加了no-loop true,防止了自身规则中,Fact对象的修改导致规则的重新触发,但是没有防止no_loop_rule_02规则中,修改Fact对象,导致no_loop_rule_01的触发。
2、lock-on-active结果
结论:
1、阻止了自身的死循环。
2、阻止了别的规则修改Fact对象,导致之前的规则触发。
五、完整代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-no-loop-and-lock-on-active
六、参考链接
1、https://stackoverflow.com/questions/17042437/what-is-the-difference-between-no-loop-and-lock-on-active-in-drools
猜你喜欢
- 2024-10-02 drools中使用全局变量(全局变量errno)
- 2024-10-02 基于Flink和规则引擎的实时风控解决方案
- 2024-10-02 IF嵌套层数太多?试试Drools规则引擎
- 2024-10-02 drools执行完某个规则后终止别的规则执行
- 2024-10-02 规则引擎Drools 6.5 Final 入门(规则引擎使用案例场景)
- 2024-10-02 JAVA-工作流引擎-activiti-Tasks介绍
- 2024-10-02 drools中使用function(drools实例)
- 2024-10-02 drools执行指定的规则(drools使用)
- 2024-10-02 Drools在eclipse中的安装与验证(eclipse安装installation folder)
- 2024-10-02 drools规则属性(rule attributes)的使用
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)