Drools中no-loop和lock-on-active在循环控制上有什么具体差异?
- 内容介绍
- 文章标签
- 相关推荐
本文共计878个文字,预计阅读时间需要4分钟。
在编写Drools规则时,可能会遇到死循环问题。若想确保某个规则只执行一次,可以采取以下措施:
1. 使用规则优先级:为规则设置不同的优先级,确保低优先级的规则不会重复触发高优先级的规则。
2. 使用规则标记:在规则上使用特定的标记,通过在规则执行后检查标记来避免重复执行。
3. 使用状态变量:在规则执行前检查一个状态变量,执行后更新该变量,以防止规则再次执行。
4. 使用规则流控制:通过在规则流中使用控制结构(如if-then-else)来避免不必要的规则触发。
例如,可以这样修改规则:
java// 假设有一个状态变量来标记规则是否已执行boolean ruleExecuted=false;
rule RuleName when // 触发条件 then if (!ruleExecuted) { // 执行规则逻辑 ruleExecuted=true; } end
通过这种方式,可以确保该规则仅执行一次。
一、背景在我们编写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。
结论: 从上图中可以看出,虽然规则no_loop_rule_01上加了no-loop true,防止了自身规则中,Fact对象的修改导致规则的重新触发,但是没有防止no_loop_rule_02规则中,修改Fact对象,导致no_loop_rule_01的触发。
结论:
1、阻止了自身的死循环。
2、阻止了别的规则修改Fact对象,导致之前的规则触发。
gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-no-loop-and-lock-on-active
六、参考链接1、stackoverflow.com/questions/17042437/what-is-the-difference-between-no-loop-and-lock-on-active-in-drools
本文共计878个文字,预计阅读时间需要4分钟。
在编写Drools规则时,可能会遇到死循环问题。若想确保某个规则只执行一次,可以采取以下措施:
1. 使用规则优先级:为规则设置不同的优先级,确保低优先级的规则不会重复触发高优先级的规则。
2. 使用规则标记:在规则上使用特定的标记,通过在规则执行后检查标记来避免重复执行。
3. 使用状态变量:在规则执行前检查一个状态变量,执行后更新该变量,以防止规则再次执行。
4. 使用规则流控制:通过在规则流中使用控制结构(如if-then-else)来避免不必要的规则触发。
例如,可以这样修改规则:
java// 假设有一个状态变量来标记规则是否已执行boolean ruleExecuted=false;
rule RuleName when // 触发条件 then if (!ruleExecuted) { // 执行规则逻辑 ruleExecuted=true; } end
通过这种方式,可以确保该规则仅执行一次。
一、背景在我们编写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。
结论: 从上图中可以看出,虽然规则no_loop_rule_01上加了no-loop true,防止了自身规则中,Fact对象的修改导致规则的重新触发,但是没有防止no_loop_rule_02规则中,修改Fact对象,导致no_loop_rule_01的触发。
结论:
1、阻止了自身的死循环。
2、阻止了别的规则修改Fact对象,导致之前的规则触发。
gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-no-loop-and-lock-on-active
六、参考链接1、stackoverflow.com/questions/17042437/what-is-the-difference-between-no-loop-and-lock-on-active-in-drools

