首页IT科技规则引擎 流程引擎(第2-4-2章 规则引擎Drools入门案例-业务规则管理系统-组件化-中台)

规则引擎 流程引擎(第2-4-2章 规则引擎Drools入门案例-业务规则管理系统-组件化-中台)

时间2025-05-04 01:01:07分类IT科技浏览4569
导读:3. Drools入门案例 全套代码及资料全部完整提供,点此处下载...

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坐标

<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>

第二步:根据drools要求创建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>

注意:上面配置文件的名称和位置都是固定写法          ,不能更改

第三步:创建实体类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.discount import 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 < 200 && 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 <= 300 && 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

第五步:编写单元测试

@Test public 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的模块          ,它是一个可视化的规则编辑器     。

全套代码及资料全部完整提供,点此处下载

声明:本站所有文章                 ,如无特殊说明或标注                ,均为本站原创发布           。任何个人或组织,在未征得本站同意时           ,禁止复制          、盗用      、采集                 、发布本站内容到任何网站          、书籍等各类媒体平台                。如若本站内容侵犯了原著者的合法权益                ,可联系我们进行处理     。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站搜索优化方案怎么写(网站搜索优化方案设计) vue做移动端适配(vue项目 移动端适配——rem)