《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
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属性。
后语
你的支持是我努力的最大动力!社区的建立离不开你的支持。此系列课程正在持续更新中,相关讨论QQ(593177274)已经建立,欢迎大家加入讨论。如有疑问可以留言也可以发送本人邮箱secbro2@gmail.com。击此处关注Drools博客专栏的持续更新《Drools博客专栏》
《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop的更多相关文章
- 《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规则引擎教程》第2章 追溯Drools5的使用
2.1 Drools5简述 上面已经提到Drools是通过规则编译.规则收集和规则的执行来实现具体功能的.Drools5提供了以下主要实现API: KnowledgeBuilder Knowledge ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析
转载至:https://blog.csdn.net/wo541075754/article/details/75004575 3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法 ...
- 【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 ...
- 《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析
3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KS ...
- 《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
3.2.1 什么是KIE KIE(Knowledge Is Everything),知识就是一切的简称.JBoss一系列项目的总称,在<Drools使用概述>章节已经介绍了KIE包含的大部 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
转载至:https://blog.csdn.net/wo541075754/article/details/75150267 一个标准的规则文件的格式为已“.drl”结尾的文本文件,因此可以通过记事本 ...
- 《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息
注释 像Java开发语言一样,Drools文件中也可以添加注释.注释部分Drools引擎是会将其忽略调的.单行注释使用"//",示例如下: rule "Testing C ...
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...
随机推荐
- python数据可视化、数据挖掘、机器学习、深度学习 常用库、IDE等
一.可视化方法 条形图 饼图 箱线图(箱型图) 气泡图 直方图 核密度估计(KDE)图 线面图 网络图 散点图 树状图 小提琴图 方形图 三维图 二.交互式工具 Ipython.Ipython not ...
- Java源码解释之Integer.bitCount
Java中的Integer.bitCount(i)的返回值是i的二进制表示中1的个数.源码如下: public static int bitCount(int i) { // HD, Figure 5 ...
- java sql解析
https://github.com/JSQLParser/JSqlParser 淘宝博客:http://www.searchtb.com/category/%E6%90%9C%E7%B4%A2%E5 ...
- nohup- Shell后台运行
&方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/my ...
- git常用命令【转】
先上一个git常用命令图片 Git配置 1 2 3 4 5 6 7 8 9 git config --global user.name "robbin" git config ...
- python 利用PIL库进行更改图片大小的操作
python 是可以利用PIL库进行更改图片大小的操作的,当然一般情况下是不需要的,但是在一些特殊的利用场合,是需要改变图片的灰度或是大小等的操作的,其实用python更改图片的大小还是蛮简单的,只需 ...
- 0927—MySQL常用语句集合
一.连接MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysql bin,再键入命令mysql ...
- Spring AOP(5)-- 注解
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><beans xml ...
- php读取csv乱码问题解决方法
<form action="erxian_cy.php" method="post" enctype="multipart/form-data& ...
- 使用maven时报错An error occurred while filtering resources
解决办法:右键项目-->maven-->update project .