目录
- 3. Drools入门案例
- 3.1 业务场景说明
- 3.2 开发实现
- 3.3 小结
- 3.3.1 规则引擎构成
- 3.3.2 相关概念说明
- 3.3.3 规则引擎执行过程
- 3.3.4 KIE介绍
3. Drools入门案例
全套代码及资料全部完整提供,点此处下载
本小节通过一个Drools入门案例来让大家初步了解Drools的使用方式、对Drools有一个整体概念。
3.1 业务场景说明
业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:
规则编号 | 规则名称 | 描述 |
---|---|---|
1 | 规则一 | 所购图书总价在100元以下的没有优惠 |
2 | 规则二 | 所购图书总价在100到200元的优惠20元 |
3 | 规则三 | 所购图书总价在200到300元的优惠50元 |
4 | 规则四 | 所购图书总价在300元以上的优惠100元 |
现在需要根据上面的规则计算优惠后的价格。
3.2 开发实现
第一步:创建maven工程drools_quickstart并导入drools相关maven坐标
org.drools drools-compiler 7.10.0.Final junit junit 4.12
第二步:根据drools要求创建resources/META-INF/kmodule.xml配置文件
注意:上面配置文件的名称和位置都是固定写法,不能更改
第三步:创建实体类Order
package com.itheima.drools.entity;/** * 订单 */public class Order { private Double originalPrice;//订单原始价格,即优惠前价格 private Double realPrice;//订单真实价格,即优惠后价格 public String toString() { return "Order{" + "originalPrice=" + originalPrice + ", realPrice=" + realPrice + '}'; } public Double getOriginalPrice() { return originalPrice; } public void setOriginalPrice(Double originalPrice) { this.originalPrice = originalPrice; } public Double getRealPrice() { return realPrice; } public void setRealPrice(Double realPrice) { this.realPrice = realPrice; }}
第四步:创建规则文件resources/rules/bookDiscount.drl
//图书优惠规则package book.discountimport com.itheima.drools.entity.Order//规则一:所购图书总价在100元以下的没有优惠rule "book_discount_1" when $order:Order(originalPrice < 100) then $order.setRealPrice($order.getOriginalPrice()); System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");end//规则二:所购图书总价在100到200元的优惠20元rule "book_discount_2" when $order:Order(originalPrice = 100) then $order.setRealPrice($order.getOriginalPrice() - 20); System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");end//规则三:所购图书总价在200到300元的优惠50元rule "book_discount_3" when $order:Order(originalPrice = 200) then $order.setRealPrice($order.getOriginalPrice() - 50); System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");end//规则四:所购图书总价在300元以上的优惠100元rule "book_discount_4" when $order:Order(originalPrice >= 300) then $order.setRealPrice($order.getOriginalPrice() - 100); System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");end
第五步:编写单元测试
@Testpublic void test1(){ KieServices kieServices = KieServices.Factory.get(); KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer(); //会话对象,用于和规则引擎交互 KieSession kieSession = kieClasspathContainer.newKieSession(); //构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格 Order order = new Order(); order.setOriginalPrice(210D); //将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配 kieSession.insert(order); //激活规则引擎,如果规则匹配成功则执行规则 kieSession.fireAllRules(); //关闭会话 kieSession.dispose(); System.out.println("优惠前原始价格:" + order.getOriginalPrice() + ",优惠后价格:" + order.getRealPrice());}
通过上面的入门案例我们可以发现,使用drools规则引擎主要工作就是编写规则文件,在规则文件中定义跟业务相关的业务规则,例如本案例定义的就是图书优惠规则。规则定义好后就需要调用drools提供的API将数据提供给规则引擎进行规则模式匹配,规则引擎会执行匹配成功的规则并将计算的结果返回给我们。
可能大家会有疑问,就是我们虽然没有在代码中编写规则的判断逻辑,但是我们还是在规则文件中编写了业务规则,这跟在代码中编写规则有什么本质的区别呢?
我们前面其实已经提到,使用规则引擎时业务规则可以做到动态管理。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。这样就可以做到在不重启服务的情况下调整业务规则。
3.3 小结3.3.1 规则引擎构成
drools规则引擎由以下三部分构成:
- Working Memory(工作内存)
- Rule Base(规则库)
- Inference Engine(推理引擎)
其中Inference Engine(推理引擎)又包括:
- Pattern Matcher(匹配器)
- Agenda(议程)
- Execution Engine(执行引擎)
如下图所示:
3.3.2 相关概念说明
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中被激活的规则。
3.3.3 规则引擎执行过程
3.3.4 KIE介绍
我们在操作Drools时经常使用的API以及它们之间的关系如下图:
通过上面的核心API可以发现,大部分类名都是以Kie开头。Kie全称为Knowledge Is Everything,即”知识就是一切”的缩写,是Jboss一系列项目的总称。如下图所示,Kie的主要模块有OptaPlanner、Drools、UberFire、jBPM。
通过上图可以看到,Drools是整个KIE项目中的一个组件,Drools中还包括一个Drools-WB的模块,它是一个可视化的规则编辑器。
全套代码及资料全部完整提供,点此处下载