《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
RHS语法
使用说明
RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息。RHS主要用于处理结果,因此不建议在此部分再进行业务判断。如果必须要业务判断需要考虑规则设计的合理性,是否能将判断部分放置于LHS,那里才是判断条件应该在的地方。同时,应当保持RHS的精简和可读性。
如果在使用的过程中发现需要在RHS中使用AND或OR来进行操作,那么应该考虑将一根规则拆分成多个规则。
RHS的主要功能是对working memory中的数据进行insert、update、delete或modify操作,Drools提供了相应的内置方法来帮助实现这些功能。
update(object,handle):执行此操作更新对象(LHS绑定对象)之后,会告知引擎,并重新触发规则匹配。
update(object):效果与上面方法类似,引擎会默认查找对象对应的handle。
使用属性监听器,来监听JavaBean对象的属性变更,并插入到引擎中,可以避免在对象更改之后调用update方法。当一个字段被更改之后,必须在再次改变之前调用update方法,否则可能导致引擎中的索引问题。而modify关键字避免了这个问题。
insert(newSomething()):创建一个新对象放置到working memory中。
insertLogical(newSomething()):功能类似于insert,但当创建的对象不再被引用时,将会被销毁。
delete(handle):从working memory中删除对象。
其实这些宏函数是KnowledgeHelper接口中方法对应的快捷操作,通过它们可以在规则文件中访问Working Memory中的数据。预定义变量drools的真实类型就是KnowledgeHelper,因此可以通过drools来调用相关的方法。具体每个方法的使用说明可以参考类中方法的说明。
通过预定义的变量kcontext可以访问完整的Knowledge Runtime API,而kcontext对应的接口为KieContext。查看KieContext类会发现提供了一个getKieRuntime()方法,该方法返回KieRuntime接口类,该接口中提供了更多的操作方法,对RHS编码逻辑有很大作用。
insert函数
insert的作用与在Java 类当中调用KieSession的insert方法效果一样,都是将Fact对象插入到当前的Working Memory当中,基本用法格式如下:
insert(newSomething());
调用insert之后,规则会进行重新匹配,如果没有设置no-loop为true或lock-on-active为true的规则,如果条件满足则会重新执行。update、modify、delete都具有同样的特性,因此在使用时需特别谨慎,防止出现死循环。
规则文件insert.drl
package com.rules
import com.secbro.drools.model.Product
rule "insert-check"
salience 1
when
$p : Product(type == GOLD);
then
System.out.println("insert-check:insert Product success and it's type is " + $p.getType());
end
rule "insert-action"
salience 2
when
then
System.out.println("insert-action : To insert the Product");
Product p = new Product();
p.setType(Product.GOLD);
insert(p);
end
测试代码:
@Test
public void commonTest(){
KieServices kieServices = KieServices.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("ksession-rule");
int count = kieSession.fireAllRules();
kieSession.dispose();
System.out.println("Fire " + count + " rules!");
}
打印日志:
insert-action : To insert the Product
insert-check:insert Product success and it's type is GOLD
Fire 2 rules!
根据优先级首先执行insert操作的规则,然后执行结果检测。
update函数
update函数可对Working Memory中的FACT对象进行更新操作,与StatefulSession中的update的作用基本相同。查看KnowledgeHelper接口中的update方法可以发现,update函数有多种参数组合的使用方法。在实际使用中更多的会传入FACT对象来进行更新操作。具体的使用方法前面章节已经有具体例子,不再重复示例。
delete函数
将Working Memory中的FACT对象删除,与kession中的retract/delete方法效果一样。同时delete函数和retract效果也相同,但后者已经被废弃。
modify函数
modify是基于结构化的更新操作,它将更新操作与设置属性相结合,用来更改FACT对象的属性。语法格式如下:
modify ( <fact-expression> ) {
<expression> [ , <expression> ]*
}
其中fact-expression必须是FACT对象的引用,expression中的属性必须提供setter方法。在调用setter方法时,不必再写FACT对象的引用,编译器会自动添加。
rule "modify stilton"
when
$stilton : Cheese(type == "stilton")
then
modify( $stilton ){
setPrice( 20 ),
setAge( "overripe" )
}
end
后语
此系列课程持续更新中,QQ群:593177274(可扫描左上侧栏目二维码),欢迎大家加入讨论。点击链接关注《Drools博客专栏》。由于Drools资料较少,教程编写不易,每篇博客都亲身实践编写demo。如果对你有帮助也欢迎赞赏(微信)! 也是对原创的最大支持!
《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法的更多相关文章
- 《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,就是一个约 ...
随机推荐
- git如何回退单个文件到某一个commit
答:操作步骤如下: 1. git log "filename" (如:git log README) 2. git reset "commit-id" &quo ...
- Graph_Master(连通分量_C_Trajan缩点+最小路径覆盖)
hdu_3861 题目大意:给定一张有向图,若<u,v>可达(u可以走到v,或者 v可以走到u),则<u,v>需被划分在统一城邦,问最小划分城邦数. 题解:比较裸的题,可以看出 ...
- sscanf输入总结
2017-08-21 15:09:47 writer:pprp sscanf很好用的,一般配合gets()来使用 /* theme: usage of sscanf writer:pprp date: ...
- Gym - 100712H Bridges(边—双连通分量)
https://vjudge.net/problem/Gym-100712H 题意: 给出一个图,求添加一条边后最少的桥数量. 思路: 参考了ZSQ大神的题解http://blog.csdn.net/ ...
- TCGA学习1--下载level3 level4数据
1.使用firehose_get 下载level3 level4数据 https://confluence.broadinstitute.org/display/GDAC/Download exa ...
- invocationCount和invocationTimeOut
这篇我们来学习下@Test中另外两个属性invocationCount和invocationTimeOut,前面我介绍了timOut这个属性,知道是超时监控的功能.同样,本篇两个属性和这个差不多,只不 ...
- 拉取代码过程中遇到的:post install error,please remove node_modules before retry!
这是在git → clone 之后,安装npm intall时出现的错误,完整错误提示如下: 解决: // 1.先删除node_modules这个文件 $ rm -rf node_modules/ / ...
- 阿里云centOS7.4 ftp连接不上的问题
首先查看是开启21端口 选择ECS-->安全组-->配置规则 增加21端口配置 配置如下
- Java网络编程学习A轮_01_目标与基础复习
A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...
- 使用C++为对象分配与释放内存时的几个好习惯
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/ 最近在为公司的项目写内存泄漏定位工具,遇到一些关于C++构造与析构对象的问题,在此记录一下 ...