目录
Talk is cheap. Show me the code
Drools 具有一个易于访问企业策略、易于调整以及易于管理的开源业务 规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验已编码的规则是否执行了所需的业务规则。其前身是 Codehaus 的一个开源项目叫 Drools,最近被纳入 JBoss 门下,更名为 JBoss Rules,成为了 JBoss 应用服务器的规则引擎。
Drools 被分为两个主要的部分:编译和运行时。编译是将规则描述文件按 ANTLR 3 语法进行解析,对语法进行正确性的检查,然后产生一种中间结构“descr”,descr 用 AST 来描述规则。目前,Drools 支持四种规则描述文件,分别是:drl 文件、 xls 文件、brl 文件和 dsl 文件,其中,常用的描述文件是 drl 文件和 xls 文件,而 xls 文件更易于维护,更直观,更为被业务人员所理解。运行时是将 AST传到 PackageBuilder,由 PackagBuilder来产生 RuleBase,它包含了一个或多个 Package 对象。
Drools 的语法规则将在实践中介绍,下面分析 drools 的原理。
Drools 中的 Rete 算法被称为 ReteOO,表示 Drools 为面向对象系统(Object Oriented systems)增强并优化了 Rete 算法。
在 Drools 中,规则被存 放在 Production Memory(规则库)中,推理机要匹配的 facts(事实)被存在 Working Memory(工作内存)中。当时事实被插入到工作内存中后,规则引擎会把事实和规则库里的模式进行匹配,对于匹配成功的规则再由 Agenda 负责具体执行推理算法中被激发规则的结论部分,同时 Agenda 通过冲突决策策略管理这些冲突规则的执行顺序,Drools 中规则冲突决策策略有:
- 优先级策略
- 复杂度优先策略
- 简单性优先策略
- 广度策略
- 深度策略
- 装载序号策略
- 随机策略 [5][6]。
Drools 的原理示意图
定义简单规则:
package com.aeert.droolsdemo.fact;
dialect "mvel"
rule "person"
when
$person : Person(age<11 || age>50)
then
System.out.println("这个人的年龄不符合要求!");
end
通过apollo修改规则后:
实现效果:
耗时:16
耗时:0
耗时:0
耗时:0
2020-03-27 17:11:49.348 INFO 5357 --- [Apollo-Config-1] com.aeert.SessionFactory : 规则 rules.age 发生变更: package com.aeert.droolsdemo.fact;
dialect "mvel"
rule "person"
when
$person : Person(age<11 || age>50)
then
System.out.println("这个人的年龄不符合要求!");
end -> package com.aeert.droolsdemo.fact;
dialect "mvel"
rule "person"
when
$person : Person(age<16 || age>50)
then
System.out.println("这个人的年龄不符合要求!");
end .
2020-03-27 17:11:49.352 WARN 5357 --- [Apollo-Config-1] o.d.c.kie.builder.impl.KieBuilderImpl : File 'file0.drl' is in folder '' but declares package 'com.aeert.droolsdemo.fact'. It is advised to have a correspondance between package and folder names.
这个人的年龄不符合要求!
耗时:36
这个人的年龄不符合要求!
耗时:0
这个人的年龄不符合要求!
耗时:1
这个人的年龄不符合要求!
耗时:1
2020-03-27 17:12:08.514 INFO 5357 --- [Apollo-Config-1] com.aeert.SessionFactory : 规则 rules.age 发生变更: package com.aeert.droolsdemo.fact;
dialect "mvel"
rule "person"
when
$person : Person(age<16 || age>50)
then
System.out.println("这个人的年龄不符合要求!");
end -> package com.aeert.droolsdemo.fact;
dialect "mvel"
rule "person"
when
$person : Person(age<11 || age>50)
then
System.out.println("这个人的年龄不符合要求!");
end .
2020-03-27 17:12:08.519 WARN 5357 --- [Apollo-Config-1] o.d.c.kie.builder.impl.KieBuilderImpl : File 'file0.drl' is in folder '' but declares package 'com.aeert.droolsdemo.fact'. It is advised to have a correspondance between package and folder names.
耗时:2
耗时:1
Disconnected from the target VM, address: '127.0.0.1:62266', transport: 'socket'
2020-03-27 17:12:19.807 INFO 5357 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
Process finished with exit code 130 (interrupted by signal 2: SIGINT)
测试代码:
@Test
void contextLoads() throws InterruptedException {
for (int i = 0; i < 50; i++) {
Long start = System.currentTimeMillis();
KieSession ksession = null;
try {
ksession = sessionFactory.getSession("rulesAge");
Person person = new Person();
person.setName("蔡徐坤");
person.setAge(12);
ksession.insert(person);
ksession.fireAllRules(1);
} catch (Exception e) {
e.printStackTrace();
} finally {
// ksession.dispose();
}
System.out.println("耗时:" + (System.currentTimeMillis() - start));
Thread.sleep(5000);
}
}
pom:
<dependency>
<groupId>com.aeert</groupId>
<artifactId>drools-apollo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
ImportConfig:
@Configuration
@Import({SessionFactory.class})
public class ImportConfig {
}
apollo:
其中nameSpace(指定apollonameSpace)默认rules, start(匹配规则头,防止非drools规则初始化异常)默认rules
如下:
示例代码地址:下载
关注公众号《小马JAVA》
回复 drools 即可获取项目源码
回复 drools视频 即可获取drools视频教程
文章浏览阅读1.6k次,点赞2次,收藏6次。在axml文件中写入代码&lt;view class="campus-img"&gt; &lt;block a:for="{{imgarr}}"&gt; &lt;image src="{{item}}" mode="scaleToFill" onTap="img_支付宝小程序 查看大图
文章浏览阅读135次。Msyqldump和Xtrabackup全备与增量备份mysql数据库1、概述:数据备份的介绍,类型,及具;msyqldump备份的实现和数据恢复;(4GB)Xtrabackup备份的实现和数据恢复;(百G)备份和恢复(数据):2、介绍★备份:存储的数据副本;原始数据:持续改变;(考虑问题)★恢复:把副本应到线上系统;仅能恢复备份操作时刻的数据状态;★时间点恢复:bin-l..._mysqldump跟xtrabackup进行增量备份
文章浏览阅读874次。代码_axi设备有中断端口吗?
文章浏览阅读7.7w次,点赞56次,收藏272次。一、zip格式 zip可能是目前使用的最多的文档压缩格式。优点:可以在不同的操作系统平台上使用。缺点:支持的压缩率不是很高。而tar.gz和tar.bz2在压缩率方面做得非常好。压缩一个zip文件(命令): zip-r newfilename.zip filename (-r是压缩文件,newfilename.zip是指压缩之后的文件名称,filename是指要压缩的..._linux 压缩文件
文章浏览阅读2.7w次,点赞12次,收藏22次。树:子树没有左右之分二叉树、有序树:左右有序二叉树与有序树:在只有一棵树的情况下,二叉树有左右之分、有序树无左右之分另外:二叉树是有序的,可以为空或一个根节点以及两个分别称为左子树和右子树的互不相交的二叉树组成。_有序树和二叉树的区别
文章浏览阅读335次。android design materialchange text appearanceandroid:textAppearance="?android:textAppearanceMediumandroid:background="#2196F3"android开发网站layouttextView中的layout_width其实是viewGroup的属性,用来进行大小设定位置设定。而textV..._design android
文章浏览阅读299次。注意这里的代码是拍照的,拍照uniapp返回的路径是 _doc/uniapp_temp_1678758693371/camera/1678758699703.jpg 这种格式的路径,无法直接使用 img 标签展示,但是如果不用img标签展示,使用image,生成出来的图片会非常的模糊,因为image他打包后是被当做 背景图片渲染的,而不是当做图片。html2canvas是无法直接在app中使用的,但是uniapp提供了renderjs,所以我们还是能在uniapp中使用html2canvas的。_uniapp照片水印
文章浏览阅读1.8k次。python主动创建路径文件并创建日志log文件,可以显示时间信息(get_timestamp()),不需要可以去掉。_python创建log文件
文章浏览阅读150次。A Digital Library contains millions of books, stored according to their titles, authors, key words of their abstracts, publishers, and published years. Each book is assigned an unique 7-digit number a..._pat advanced level 1022
文章浏览阅读224次。jdk安装第一步:访问官网 : 官网下载最新版本jdk_安装java环境jdk
文章浏览阅读799次。文章目录注:在学习的过程中记录@Insert和@InsertProvider @Insert实现 @InsetProvider实现实体类pojo@Data@Table(name = "easy_excel")public class DemoData { @Id private String name; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date time..._@insertprovider遍历数组添加
文章浏览阅读6k次。在开发JavaWeb应用时,为了实现配置分离,我们有时候需要在CLASSPATH中设置的配置文件的路径。但是在使用Intellij idea时发现发现设置的CLASSPATH不生效。尝试过的方法:1.在intellij idea 项目中的module中添加2.在Windows --我的电脑--属性--高级系统变量里设置CLASSPATH都没有效果!找了许久的原因,偶然发现原来创建Tomcat se..._idea 中classpath为空