【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
转载至:https://blog.csdn.net/wo541075754/article/details/75201934
no-loop
定义当前的规则是否不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行。什么情况下会出现规则被多次重复执行呢?下面看一个实例:
package com.rules import 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.rules import 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);
end rule otherRule
when
productObj : Product(discount > 1);
then
System.out.println("被触发了" + productObj.getDiscount());
end
此时执行会发现,当第一个规则执行update方法之后,规则otherRule也会被触发执行。如果注释掉update方法,规则otherRule则不会被触发。那么,这个问题是不是就没办法解决了?当然可以,那就是引入lock-on-active true属性。
【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop的更多相关文章
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
转载至:https://blog.csdn.net/wo541075754/article/details/75150267 一个标准的规则文件的格式为已“.drl”结尾的文本文件,因此可以通过记事本 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
转载至:https://blog.csdn.net/wo541075754/article/details/76651073 RHS语法 使用说明 RHS是满足LHS条件之后进行后续处理部分的统称,该 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
转载:https://blog.csdn.net/wo541075754/article/details/75332720 agenda-group 规则的调用与执行是通过StatelessKieSe ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
转载:https://blog.csdn.net/wo541075754/article/details/74943236 3.2.1 什么是KIE KIE(Knowledge Is Everythi ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 auto-focus
转载至:https://blog.csdn.net/wo541075754/article/details/75349556 auto-focus 在agenda-group章节,我们知道想要让Age ...
- 《Drools7.0.0.Final规则引擎教程》第2章 追溯Drools5的使用
2.1 Drools5简述 上面已经提到Drools是通过规则编译.规则收集和规则的执行来实现具体功能的.Drools5提供了以下主要实现API: KnowledgeBuilder Knowledge ...
- 《Drools7.0.0.Final规则引擎教程》Springboot+规则重新加载
在<Drools7.0.0.Final规则引擎教程>之Springboot集成中介绍了怎样将Drools与Springboot进行集成,本篇博客介绍一下集成之后,如何实现从数据库读取规则并 ...
- 《Drools7.0.0.Final规则引擎教程》第3章 3.1 Hello World 实例
3.1 Hello World 实例 在上一章中介绍了Drools5x版本中规则引擎使用的实例,很明显在Drools7中KnowledgeBase类已经标注为"@Deprecated&quo ...
- 《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
一个标准的规则文件的格式为已".drl"结尾的文本文件,因此可以通过记事本工具进行编辑.规则放置于规则文件当中,一个规则文件可以放置多条规则.在规则文件当中也可以存放用户自定义的函 ...
随机推荐
- 自适应界面开发总结——WPF客户端开发
1.由于界面大小是变化的,所以必须有一个稳定不变的参考界面(即在一个标准的界面尺寸下进行WPF界面开发,比如:发票查验V3.0的美工设计尺寸——1024*740): PS:在WPF的用户控件Xam ...
- 3.5 MIPS体系结构
计算机组成 3 指令系统体系结构 3.5 MIPS体系结构 MIPS是精简指令系统的代表,采用了与X86相反的设计理念,并引领了精简指令系统的潮流,那就让我们一起来看一看这究竟是怎么一回事. 要探讨M ...
- python独角兽 Flask + Gunicorn
1.构建程序运行所需的虚拟环境 安装Miniconda 创建虚拟环境 添加程序运行依赖包 添加Gunicorn依赖 方式一:最简单的使用 easy_install 安装或者更新 方式二:下载源码安装 ...
- Vue--Vue.nextTick()的使用
Vue.nextTick()是比较常用到的API Vue官网对它的解释是:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 首先要明白Vue的响应式 ...
- 073——VUE中vuex之使用actions和axios异步初始购物车数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- POJ 2965贪心神解
貌似和POj1753一样是一般都是用为位运算+枚举做的.但是捏.这里用了贪心算法很容易.怎么样才能做到只把当前位置的+改为-而不改变其它所有位置的符号呢.嗯.就是把当前位置所在的行和列所在的元素都反转 ...
- 随机产生div背景颜色变化
使一个DIV在每次刷新后变化背景颜色,很容易想到JS的random()函数:通过每次刷新页面产生使背景rgb随机产生 <!doctype html> <html> <he ...
- 返回书签 GotoBookmark
property Bookmark: TBookmark read GetBookmark write GotoBookmark; 直接给Bookmark属性赋值,还是 调用数据集GotoBookma ...
- spring aop 的理解
spring aop的相关概念(所有的概念都是为了生成代理类这个过程所需要的信息的抽象): 1.Targer:目标对象.被代理的对象. 2.Advice:增强/通知.就是为目标对象扩展的功能.分为前置 ...
- 网络协议栈学习(二)创建 socket
下面通过学习linux 1.2.13源码进一步理解socket通信机制.对该版本源码的学习主要参考<Linux内核网络栈源代码情景分析>(曹桂平 编著). 要理解socket的本质,就要理 ...