Drools入门案例(3/6)
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 { @Test public 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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY