1、业务场景说明

业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:

现在需要根据上面的规则计算优惠后的价格

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要求创建resource/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.jiusen.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

第五步:编写单元测试

package com.itheima.test;import com.jiusen.drools.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 DroolsTest
{@Testpublic void test1(){KieServices kieServices = KieServices.Factory.get();//获得Kie容器对象//默认自动加载 META-INF/kmodule.xml//从KieServices中获得KieContainer实例,其会加载kmodule.xml文件并load规则文件KieContainer kieContainer = kieServices.newKieClasspathContainer();//从Kie容器对象中获取会话对象KieSession session = kieContainer.newKieSession();//Fact对象,事实对象Order order = new Order();order.setOriginalPrice(500d);//将order对象插入到规则内存中session.insert(order);//激活规则,由Drools框架自动进行规则匹配,如果规则匹配成功,则执行当前规则int count = session.fireAllRules();System.out.println(count);//关闭会话session.dispose();System.out.println("优惠后的价格: " + order.getRealPrice());}
}

前面已经提到,使用规则引擎时业务规则可以做到动态管理。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、更新、提交业务规则等。这样就可以做到在不重启服务的情况下调整业务规则。

3、规则引擎构成

drools规则引擎由以下三部分构成:

  • Working  Memory(工作内存)
  • Rule Base(规则库)
  • Inference Engine(推理引擎)

其中Inference Engine(推理引擎)又包括:

  • Pattern Matcher(匹配器)
  • Agenda(议程)
  • Execution Engine(执行引擎)

如图:

4、相关概念说明

Working Memory【工作内存】:drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可。

Fact【事实】:是指drools规则应用当中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象。

Rule Base【规则库】:我们在规则文件中定义的规则都会被加载到规则库中。

Pattern Matcher【匹配器】:将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。

Agenda【议程】:用于存放通过匹配器进行模式匹配后被激活的规则。

Execution Engine【执行引擎】:执行Agenda中被激活的规则。

5、规则引擎执行过程

6、KIE介绍

我们在操作Drools时经常使用的API以及他们之间的关系如下图

通过上面的核心API可以发现,大部分类名都是以Kie开头。Kie全称为Knowledge IS  Everything,即“只是就是一切”的缩写,是JBoss一系列项目的总称。如下图所示,Kie的主要模块有OptaPlanner、Drools、UberFire、jBPM。

Drools入门案例(3/6)相关推荐

  1. Drools规则引擎之入门案例(一)

    1.问题引出 一个在线申请信用卡的业务场景,用户需要录入个人信息,通过上图可以看到,用户录入的个人信息包括姓名.性别.年龄.学历.电话.所在公司.职位.月收入.是否有房.是否有车.是否有信用卡等.录入 ...

  2. drools的简单入门案例

    文章目录 一.背景 二.为什么要学习drools 三.实现上方这个简单的打折案例 1.引入jar包 2.编写kmodule.xml配置文件 3.编写规则文件 1.规则文件的语法 2.编写规则文件 3. ...

  3. 【Drools规则引擎】基础入门案例五(Kie-Server+WorkBench)

    [Drools规则引擎]基础入门案例五(Kie-Server+WorkBench) 介绍 搭建WorkBench 搭建Kie-Server 使用WorkBench 访问登入 客户端测试 介绍 java ...

  4. drools入门-02

    drools入门-02 一. 另一种方式 上一篇我们讲了一下基本理论和入门demo,这一篇我们接着讲 我们用springboot另一种方式整合(这个比较常用) 1. 引入依赖 <!-- 规则引擎 ...

  5. 2021年大数据Flink(八):Flink入门案例

    目录 Flink入门案例 前置说明 API 编程模型 准备工程 pom文件 log4j.properties Flink初体验 需求 编码步骤 代码实现 Flink入门案例 前置说明 API API ...

  6. Python:Scrapy的安装和入门案例

    Scrapy的安装介绍 Scrapy框架官方网址:http://doc.scrapy.org/en/latest Scrapy中文维护站点:http://scrapy-chs.readthedocs. ...

  7. Vue安装配置以及入门案例

    Vue Vue简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不 ...

  8. AOP配置开发入门案例

    该AOP开发入门案例采用XML文件方式配置开发(非注解方式)共包含一个xml文件和4个Java类,创建好web工程后引入相应jar包(文末会给出),建好包(若自定义包名注意更改类中的包名),将xml文 ...

  9. python与人工智能编程-总算明白python人工智能编程入门案例

    Python是非常简洁的一种脚本语言,写同样的程序,代码量仅为java的三分一,除了性能没有Java强之外,它的优点还是相当多的.以下是小编为你整理的python人工智能编程入门案例 下载Active ...

最新文章

  1. Exchange Server 2013 LAB Part 4.内部客户端访问
  2. python导入模块的变量_python 环境变量和import模块导入方法(详解)
  3. Oracle里schema理解
  4. 出租司机给我上的MBA课 -- [ 来自: ] [作者:cexo255]
  5. 用 git 维护 vim 代码
  6. 修改ubuntu默认的Python版本号
  7. SAP License:一位在ERP行业从业九年的经验总结
  8. 初学python之生成器
  9. 大数据技术对企业发展的作用
  10. C#:判断某个对象有没有某个键的方法
  11. matlab遥感代码,遥感融合定量评价matlab程序代码
  12. python形参、实参
  13. java虚拟机之内存模型
  14. 辞职信 求助编辑百科名片
  15. 如何通过反向代理实现伪装IP?
  16. An adaptive LeNet-5 model for anomaly detection(翻译)
  17. MPLS LDP的原理与配置
  18. mysql数据库备份和恢复
  19. 使用python编写网络爬虫
  20. C++与JAVA迭代器的使用

热门文章

  1. 利用 PRIMO 重构 M87 黑洞图像,普林斯顿高等研究院成功将「甜甜圈」变身「金戒指」
  2. 【mycat】mycat介绍
  3. 国“潘多拉”商标持有者告上法庭提起诉讼 目前案件已受理
  4. 论文笔记,物体六自由度位姿估计,DenseFusion: 6D Object Pose Estimation by Iterative Dense Fusion
  5. covmatrix matlab,matlab cov函数
  6. jQuery库的介绍与使用
  7. Win10 系统WLAN 显示已关闭,图标是红叉 ,怎么办?
  8. PyTorch1.9.1 GPU版本安装(python3.8+pyTorch1.9.1, torch1.9.1/cu111 + torchvision0.10.1/cu111)
  9. 基于javaweb的房屋租赁后台管理系统
  10. bfv同态加密_同态加密简明教程