Drools(2):Drools快速入门
1 业务场景说明
⽤户购买的⾦额和对应送多少积分的规则如下:
100元以下, 不加分
100元-500元 加100分
500元-1000元 加500分
1000元 以上 加1000分
2 开发实现
第⼀步:创建maven⼯程droolsDemo并导⼊drools相关maven坐标
<dependencies><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.10.0.Final</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
第⼆步:根据drools要求创建resources/META-INF/kmodule.xml配置⽂件
需要有⼀个配置⽂件告诉代码规则⽂件drl在哪⾥,在drools中这个⽂件就是kmodule.xml,放置到resources/META-INF⽬录下。
编写kmodule.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule"><!--name:指定kbase的名称,可以任意,但是需要唯⼀ packages:指定规则⽂件的⽬录,需要根据实际情况填写,否则⽆法加载到规则⽂件 default:指定当前kbase是否为默认 --><kbase name="myKbase1" packages="rules" default="true"><!--name:指定ksession名称,可以任意,但是需要唯⼀ default:指定当前session是否为默认 --><ksession name="ksession-rule" default="true"/></kbase>
</kmodule>
注意:上⾯配置⽂件的名称和位置都是固定写法,不能更改
Kmodule中可以包含⼀个到多个kbase,分别对应drl的规则⽂件。
Kbase需要⼀个唯⼀的name,可以取任意字符串。
packages为drl⽂件所在resource⽬录下的路径。注意区分drl⽂件中的package与此处的package不⼀定相同。多个包⽤逗号分隔。默认情况下会扫描resources⽬录下 所有(包含⼦⽬录)规则⽂件。 kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不⽤名称就可以查找到该KieBase,但每个module 最多只能有⼀个默认KieBase。
kbase 下⾯可以有⼀个或多个 ksession, ksession 的 name 属性必须设置,且必须唯⼀。
第三步:创建实体类Order
package com.xiongpeng.entity;public class Order {private int amout;//订单原价⾦额private int score;//积分public int getAmout() {return amout;}public void setAmout(int amout) {this.amout = amout;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}@Overridepublic String toString() {return "Order{" + "amout=" + amout + ", score=" + score + '}';}
}
第四步:创建规则文件resources/rules/score-rules.drl
package rules
import com.xiongpeng.entity.Order//规则1:100元以下, 不加分
rule "score_1"
when$s : Order(amout <= 100)
then$s.setScore(0);System.out.println("成功匹配到规则1:100元以下, 不加分 ");
end//规则2:100元-500元 加100分
rule "score_2"
when$s : Order(amout > 100 && amout <= 500)
then$s.setScore(100);System.out.println("成功匹配到规则2:100元-500元 加100分 ");
end//规则3:500元-1000元 加500分
rule "score_3"
when$s : Order(amout > 500 && amout <= 1000)
then$s.setScore(500);System.out.println("成功匹配到规则3:500元-1000元 加500分 ");
end//规则4:1000元 以上 加1000分
rule "score_4"
when$s : Order(amout > 1000)
then$s.setScore(1000);System.out.println("成功匹配到规则4:1000元 以上 加1000分 ");
end
这个规则⽂件就是描述了,当符合什么条件的时候,应该去做什么事情,每当规则有变动的时 候,我们只需要修改规则⽂件,然后重新加载即可⽣效。
第五步:编写单元测试
package com.xiongpeng.test;import com.xiongpeng.entity.Order;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;public class TestDrools {@Testpublic void test1(){//第一步KieServices kieServices = KieServices.Factory.get();//第二步KieContainer kieContainer = kieServices.getKieClasspathContainer();//第三步//会话对象,⽤于和规则引擎交互KieSession kieSession = kieContainer.newKieSession();//构造订单对象,设置订单⾦额,由规则引擎计算获得的积分Order order = new Order(); order.setAmout(200);//第四步//将数据交给规则引擎,规则引擎会根据提供的数据进⾏规则匹配kieSession.insert(order);//第五步//激活规则引擎,如果匹配成功则执⾏规则kieSession.fireAllRules();//第六步// 关闭会话kieSession.dispose();//打印结果;System.out.println("订单提交之后积分:"+order.getScore()); }
}
运行结果如下:
3 案例小结
我们在操作Drools时经常使⽤的API以及它们之间的关系如下图:
Kie全称为Knowledge Is Everything,即"知识就是⼀切"的缩写,是Jboss⼀系列项⽬的总称
规则引擎构成
drools规则引擎由以下三部分构成:
- Working Memory(⼯作内存)
- Rule Base(规则库)
- Inference Engine(推理引擎)
其中Inference Engine(推理引擎)⼜包括:
- Pattern Matcher(匹配器) 具体匹配哪⼀个规则,由这个完成
- Agenda(议程)
- Execution Engine(执⾏引擎)
如下图所示:
相关概念说明
Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则⽂件中定义的规则进⾏模式匹配,所以我们开发的应⽤程序只需要将我们的数据插⼊到Working Memory中即可,例如本案例中我们调⽤kieSession.insert(order)就是将order对象插⼊到了⼯作内存中。
Fact:事实,是指在drools 规则应⽤当中,将⼀个普通的JavaBean插⼊到Working Memory后的对象就是Fact对象,例如本案例中的Order对象就属于Fact对象。Fact对象是我们的应⽤和规则引擎进⾏数 据交互的桥梁或通道。
Rule Base:规则库,我们在规则⽂件中定义的规则都会被加载到规则库中。
Pattern Matcher:匹配器,将Rule Base中的所有规则与Working Memory中的Fact对象进⾏模式匹配,匹配成功的规则将被激活并放⼊Agenda中。
Agenda:议程,用于存放通过匹配器进⾏模式匹配后被激活的规则。
Execution Engine:执行引擎,执⾏Agenda中被激活的规则。
规则引擎执⾏过程
Drools(2):Drools快速入门相关推荐
- Drools规则引擎之入门案例(一)
1.问题引出 一个在线申请信用卡的业务场景,用户需要录入个人信息,通过上图可以看到,用户录入的个人信息包括姓名.性别.年龄.学历.电话.所在公司.职位.月收入.是否有房.是否有车.是否有信用卡等.录入 ...
- Shiro第一个程序:官方快速入门程序Qucickstart详解教程
目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...
- 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧
异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...
- Spring Boot 2 快速教程:WebFlux 快速入门(二)
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...
- Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)
2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...
- 《iOS9开发快速入门》——导读
本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序
BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...
- python scrapy菜鸟教程_scrapy学习笔记(一)快速入门
安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...
- OpenStack快速入门
OpenStack云计算快速入门(1) 该教程基于Ubuntu12.04版,它将帮助读者建立起一份OpenStack最小化安装.我是五岳之巅,翻译中多采用意译法,所以个别词与原版有出入,请大家谅解.我 ...
- Expression Blend实例中文教程(2) - 界面快速入门
上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Ble ...
最新文章
- 【HDU】1305 Immediate Decodability(字典树:结构体数组,二维数组,链表/指针)
- 为什么我们使用Linux内核的(网络)协议栈?
- 《Offer一箩筐》2W字总结面试套路14问——不给例子的教程都是耍流氓!!
- 5G信令(就是用户身份信息)风暴——就是客户端通过公钥加密的消息(携带手机IMSI号)发给服务端,服务器需用私钥解密,这个解密比较消耗资源,如果短时间大量请求到来就会触发信令风暴...
- C#的两种类据类型:值类型和引用类型
- jzoj4805-[NOIP2016提高A组模拟9.28]跟踪【dfs,树】
- c#+handle.exe实现升级程序在运行时自动解除文件被占用的问题
- AI算法连载14:统计之模型选择
- mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...
- script setup 实验性 vue 语法
- Linux常用的基础组件
- MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 区别与使用场合
- java中map的使用和排序使用
- webstorm配置vue模板 webstorm快速生成vue模板
- 党建管理系统开发,组织部干部人事任免平台建设方案
- 联想微型计算机m8000u配置,联想的产品介绍-20210412075714.pdf-原创力文档
- 亲民地理-第39期-佛山(2)南风古灶_我是亲民_新浪博客
- 互联网无处不在的“推荐算法”解析
- Simulink学习——弹球仿真三维动画模型(Simulink3D演示动画学习01)
- win11怎么关闭自动更新系统
热门文章
- 计算机测试的论文,计算机软件测试毕业论文(定稿).doc
- 高端物理学名词_物理专业名词
- 数据库锁机制1------共享锁
- STK之Commu模块之二-仿真同步卫星与地面站通信显示EIRP分布
- 如何用python做软件导出cad_基于Python运用PyComCAD进行Autocad二次开发实例汇集
- linux steam安装路径,Ubuntu Kylin 18.04 steam安装及解决方法
- dict后缀_词根词缀法记单词之dict
- 动软出现“添加服务器配置失败,请检查是否有写入权限或文件是否存在“错误
- 关于dom4j中jaxen运行报错问题
- 虚拟机访问服务器文件夹,浅析CentOS8虚拟机访问Windows10主机文件夹方法