一、关于 drools 规则引擎
前面写过一篇 Drools 规则引擎相关的文章,这篇文章主要记录一下规则引擎的环境搭建和简单示例。不熟悉 drools 的朋友可以看看这篇文章: 自己写个 Drools 文件语法检查工具——栈的应用之编译器检测语法错误
介绍的内容:
Drools 规则引擎的使用场景
Drools 规则引擎的优点
Drools的基本工作工程(Fact对象、Drl文件内容、Drools的基础语法)
drools 文件的形式
Drools 文件语法初步检查
二 、Drools 的环境搭建及简单示例环境: idea + jdk1.8 + gradle
我用的是 gradle 构建 java 工程的方式、用 maven 构建的可以参考配置
构造这样一个需求背景,双十一来了,商品打折,假设商品价格 (0,500], 打85折,商品价格 (500, 1000],打8折, 商品价格 (1000,∞), 一律减 300。
1. 创建项目新建一个 gradle 项目,创建包:com.sharpcj,新建类 Product.java 和 Main.java:
Product.java 文件如下:
package com.sharpcj; public class Product { private String name; // 商品名称 private double prePrice; // 商品定价 private double realPrice; //商品实际售价 public Product() { } public Product(String name, double prePrice) { this.name = name; this.prePrice = prePrice; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrePrice() { return prePrice; } public void setPrePrice(double prePrice) { this.prePrice = prePrice; } public double getRealPrice() { return realPrice; } public void setRealPrice(double realPrice) { this.realPrice = realPrice; } }然后在 Main.java 新建 main 方法。
2. Gradle引入Drools库打开 build.gradle 文件,添加相应的插件和依赖
plugins { id 'java' } plugins { id 'application' } mainClassName = 'com.sharpcj.Main' group 'com.sharpcj' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compile group: 'org.kie', name: 'kie-api', version: '7.5.0.Final' compile group: 'org.drools', name: 'drools-compiler', version: '7.5.0.Final' }引入 Java 插件,使Gradle可以构建Java代码,同时引入了执行Drools依赖的两个库, 指定了 mainClassName。
3.编写 drools 文件在 resources 目录下面新建包 demo.rules,用来存放 drools 规则文件。然后新建文件 product.drl,
内容如下:
package com.sharpcj; rule "Product price less than 500" // 给规则取个名 when pp : Product( prePrice <= 500 ) // 规则 then // 符合规则后执行的操作,是Java代码 double prePrice = pp.getPrePrice(); pp.setRealPrice(prePrice * 0.85); System.out.println(pp.getName() + "活动价是:" + pp.getRealPrice()); end rule "Product price less than 1000" // 给规则取个名 when p : Product( prePrice > 500 && prePrice <=1000 ) // 规则 then // 符合规则后执行的操作,是Java代码 double prePrice = p.getPrePrice(); p.setRealPrice(prePrice * 0.8); System.out.println(p.getName() + "活动价是:" + p.getRealPrice()); end rule "Product price more than 1000" // 给规则取个名 when p : Product( prePrice > 1000 ) // 规则 then // 符合规则后执行的操作,是Java代码 double prePrice = p.getPrePrice(); p.setRealPrice(prePrice - 300); System.out.println(p.getName() + "活动价是:" + p.getRealPrice()); end 4.编写配置文件运行 drools 需要一个固定的配置文件,在 resources 文件下的目录 META_INF,名称固定为 kmodule.xml:
配置文件至少包含如下几行:
<kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase packages="demo.rules"> <ksession /> </kbase> </kmodule>配置简单说明:
Kmodule中可以包含一个到多个kbase,分别对应drl的规则文件。
Kbase需要一个唯一的name,可以取任意字符串。
packages为drl文件所在resource目录下的路径。注意区分drl文件中的package与此处的package不一定相同。
多个包用逗号分隔。默认情况下会扫描resources目录下所有(包含子目录)规则文件。
kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称就可以查找到该KieBase,但每个module最多只能有一个默认KieBase。
kbase下面可以有一个或多个ksession,ksession的name属性必须设置,且必须唯一。
5.让规则文件程序跑起来