《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
来源:互联网 发布:黄磊人设崩塌 知乎 编辑:程序博客网 时间:2024/05/29 04:43
no-loop
定义当前的规则是否不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行。什么情况下会出现规则被多次重复执行呢?下面看一个实例:
package com.rulesimport com.secbro.drools.model.Product;rule updateDistcount no-loop false when productObj:Product(discount > 0); then productObj.setDiscount(productObj.getDiscount() + 1); System.out.println(productObj.getDiscount()); update(productObj); end
其中Product对象的discount属性值默认为1。执行此条规则时就会发现程序进入了死循环。也就是说对传入当前workingMemory中的FACT对象的属性进行修改,并调用update方法就会重新触发规则。从打印的结果来看,update之后被修改的数据已经生效,在重新执行规则时并未被重置。当然对Fact对象数据的修改并不是一定需要调用update才可以生效,简单的使用 set 方法设置就可以完成,但仅仅调用set方法时并不会重新触发规则。所以,对insert、retract、update方法使用时一定要慎重,否则极可能会造成死循环。
可以通过设置no-loop为true来避免规则的重新触发,同时,如果本身的RHS部分有insert、retract、update等触发规则重新执行的操作,也不会再次执行当前规则。
上面的设置虽然解决了当前规则的不会被重复执行,但其他规则还是会收到影响,比如下面的例子:
package com.rulesimport com.secbro.drools.model.Product;rule updateDistcount no-loop true when productObj:Product(discount > 0); then productObj.setDiscount(productObj.getDiscount() + 1); System.out.println(productObj.getDiscount()); update(productObj); endrule otherRule when productObj : Product(discount > 1); then System.out.println("被触发了" + productObj.getDiscount()); end
此时执行会发现,当第一个规则执行update方法之后,规则otherRule也会被触发执行。如果注释掉update方法,规则otherRule则不会被触发。那么,这个问题是不是就没办法解决了?当然可以,那就是引入lock-on-active true属性。
后语
你的支持是我努力的最大动力!社区的建立离不开你的支持。此系列课程正在持续更新中,相关讨论QQ(593177274)已经建立,欢迎大家加入讨论。如有疑问可以留言也可以发送本人邮箱secbro2@gmail.com。击此处关注Drools博客专栏的持续更新《Drools博客专栏》
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 lock-on-active
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 auto-focus
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective
- 《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 定时器
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
- 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
- 《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
- 《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息
- 《Drools7.0.0.Final规则引擎教程》第4章 4.9 关键字
- 《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
- 《Drools7.0.0.Final规则引擎教程》第4章 Query查询之基础
- 《Drools7.0.0.Final规则引擎教程》第4章 Function函数
- C.Primer.Plus(第六版)第12章 队列模拟
- Ubuntu Clion MySQL 5.7 源码调试环境搭建
- 统一所有控制器导航栏左上角、右上角的内容(考虑方案的思想、侵略性)
- ActiveMQ集群下的消息回流功能
- Oracle设置登陆失败超过一定次数就锁定用户
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
- 2017各大知名互联网公司Android面试题
- Java并发编程--CAS(Compare And Swap)无锁算法
- 2017.7.15 学习HDFS提供的JAVA API
- C++中面向对象的相关内容
- python核心高级学习总结1---------*args和**kwargs
- jzoj. 1302. DigitalCounter
- SQLite+Qt 图书管理系统设计(具体实现)
- [OSX]为终端(Terminal)添加色彩