Drools 入门案例——手把手教你
Drools入门案例#
业务场景说明#
业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:
规则编号 | 规则名称 | 描述 |
---|---|---|
1 | 规则一 | 所购图书总价在100元以下的没有优惠 |
2 | 规则二 | 所购图书总价在100到200元的优惠20元 |
3 | 规则三 | 所购图书总价在200到300元的优惠50元 |
4 | 规则四 | 所购图书总价在300元以上的优惠100元 |
现在需要根据上面的规则计算优惠后的价格。
开发实现#
代码结构(我用的idea开发所以默认生成的可以pass掉,仅看src即可):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | DroolsTest>tree /f D:. │ pom.xml │ ├─.idea │ .gitignore │ compiler.xml │ jarRepositories.xml │ misc.xml │ uiDesigner.xml │ workspace.xml │ ├─src │ ├─main │ │ ├─java │ │ │ │ RulesHello.java │ │ │ │ │ │ │ └─com │ │ │ └─bonelee │ │ │ Order.java │ │ │ │ │ └─resources │ │ ├─META-INF │ │ │ kmodule.xml │ │ │ │ │ └─rules │ │ bookDiscount.drl │ │ │ └─test │ └─java └─target ├─classes │ │ RulesHello. class │ │ │ ├─com │ │ └─bonelee │ │ Order. class │ │ │ ├─META-INF │ │ kmodule.xml │ │ │ └─rules │ bookDiscount.drl │ └─generated-sources └─annotations |
第一步:创建maven工程drools_quickstart并导入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>
我自己的xml文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version = "1.0" encoding = "UTF-8" ?> <project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 < / modelVersion> <groupId>org.example< / groupId> <artifactId>DroolsTest< / artifactId> <version> 1.0 - SNAPSHOT< / version> <properties> <maven.compiler.source> 8 < / maven.compiler.source> <maven.compiler.target> 8 < / maven.compiler.target> < / properties> <dependencies> <dependency> <groupId>org.drools< / groupId> <artifactId>drools - compiler< / artifactId> <version> 7.10 . 0.Final < / version> < / dependency> < / dependencies> < / project> |
第二步:根据drools要求创建resources/META-INF/kmodule.xml配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <? 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package com.bonelee; 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package rules import com.bonelee.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 |
第五步:编写测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import com.bonelee.Order; public class RulesHello { public static void main(String[] args) { //获取kie容器对象 KieServices kss = KieServices.Factory.get(); KieContainer kieContainer = kss.newKieClasspathContainer(); //从kie容器对象中获取session对象 KieSession kieSession = kieContainer.newKieSession( "ksession-rule" ); //Fact对象 Order order = new Order(); order.setOriginalPrice(240d); //插入Fact对象 kieSession.insert(order); Order order2 = new Order(); order2.setOriginalPrice(150d); kieSession.insert(order2); //激活规则,由Drools框架自动进行规则匹配,匹配成功,则执行当前规则 int count = kieSession.fireAllRules(); System.out.println( "总执行了" + count + "条规则" ); //关闭会话 kieSession.dispose(); System.out.println(order.getRealPrice()); System.out.println(order2.getRealPrice()); } } |
运行结果:
成功匹配到规则二:所购图书总价在100到200元的优惠20元
成功匹配到规则三:所购图书总价在200到300元的优惠50元
总执行了2条规则
190.0
130.0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2019-08-16 一些带dga域名的恶意软件