Drools入门案例#
业务场景说明#
业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:
规则编号 | 规则名称 | 描述 |
1 | 规则一 | 所购图书总价在100元以下的没有优惠 |
2 | 规则二 | 所购图书总价在100到200元的优惠20元 |
3 | 规则三 | 所购图书总价在200到300元的优惠50元 |
4 | 规则四 | 所购图书总价在300元以上的优惠100元 |
现在需要根据上面的规则计算优惠后的价格。
开发实现#
代码结构(我用的idea开发所以默认生成的可以pass掉,仅看src即可):
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文件内容:
<?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配置文件
<?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.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
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
第五步:编写测试
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
标签:Drools,入门,手把手,order,originalPrice,规则,100,所购,Order From: https://blog.51cto.com/u_11908275/6384734