一、关于 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.javaMain.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 name="kbase1" packages="demo.rules">
<ksession name="ksession1" />
</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.让规则文件程序跑起来

Main.java 类中编写测试方法,让规则文件跑起来:

package com.sharpcj;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession; public class Main {
public static void main(String[] args){
new Main().test();
} private void test(){
// 构建KieServices
KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
// 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
KieSession kSession = kc.newKieSession("ksession1"); Product fan = new Product("电扇", 280);
Product washer = new Product("洗衣机",2200);
Product phone = new Product("手机", 998);
kSession.insert(fan);
kSession.insert(washer);
kSession.insert(phone);
kSession.fireAllRules();
kSession.dispose();
}
}

运行结果:

三、其它说明

1.不使用配置文件形式

上面使用的配置文件形式加载 drools 文件是 drools 7.x 版本才有的,在此之前,我们通常使用代码形式加载规则文件,当然在 drools 7.x 中依然可以使用这种方式,只不过有些 API 已经过时了,或者更新了。下面用代码形式加载规则文件代码如下:

    /**
* 不使用 drools 7.x 配置文件
*/
private void test2(){
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("demo/rules/product.drl"), ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
} // 注释掉的是 drools 6.x API
/*KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();*/ // drools 7.x API
InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
Collection<KiePackage> pkgs = kbuilder.getKnowledgePackages();
kbase.addPackages(pkgs);
KieSession kieSession = kbase.newKieSession();
Product fan = new Product("电扇", 280);
Product washer = new Product("洗衣机",2200);
Product phone = new Product("手机", 998);
kieSession.insert(fan);
kieSession.insert(washer);
kieSession.insert(phone);
kieSession.fireAllRules();
kieSession.dispose();
}

运行程序依然能得到相同的结果。

2.规则文件的类型

规则文件除了 drl 文件之类,还有其它类型的文件,如 xls, csv。

四、附录

Drools 官网首页: https://www.drools.org/

Drools 官方文档: https://docs.jboss.org/drools/release/7.12.0.Final/drools-docs/html_single/index.html

Drools 规则引擎环境搭建的更多相关文章

  1. Drools规则引擎环境搭建

    Drools 是一款基于Java 的开源规则引擎,所以在使用Drools 之前需要在开发机器上安装好JDK 环境,Drools5 要求的JDK 版本要在1.5 或以上. Drools5 提供了一个基于 ...

  2. eclipse下搭建Drools规则引擎环境

    插件下载地址:http://download.jboss.org/drools/release/ 1.点开对应的版本文件,选择标红的两个压缩包下载,其他的如有需要也可以自行选择: 2.将下载的压缩包解 ...

  3. Drools规则引擎入门指南(一)

    最近项目需要增加风控系统,在经过一番调研以后决定使用Drools规则引擎.因为项目是基于SpringCloud的架构,所以此次学习使用了SpringBoot2.0版本结合Drools7.14.0.Fi ...

  4. Drools规则引擎

    一.简介 Drools is a Business Rules Management System (BRMS) solution. It provides a core Business Rules ...

  5. SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

    本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...

  6. (十五)整合 Drools规则引擎,实现高效的业务规则

    整合 Drools规则引擎,实现高效的业务规则 1.Drools引擎简介 1.1 规则语法 2.SpringBoot整合Drools 2.1 项目结构 2.2 核心依赖 2.3 配置文件 3.演示案例 ...

  7. Drools规则引擎实践直白总结

    目录 1. 创建Drools环境(引入Drools相关依赖包.现在都流行spring boot,故最简单有效的依赖才是最好的,kie-spring内部自行依赖了drools相关核心的依赖包) 2. 了 ...

  8. Drools 规则引擎应用

    规则引擎-drools 1 .场景 1.1需求 商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分 .... ...

  9. Drools 规则引擎应用 看这一篇就够了

    1 .场景 1.1需求 商城系统消费赠送积分 100元以下, 不加分 100元-500元 加100分 500元-1000元 加500分 1000元 以上 加1000分 ...... 1.2传统做法 1 ...

随机推荐

  1. ERROR getting 'android:label' attribute: attribute is not a string value

    这个的原因很多地方都有描述,原因多半是多国语言string.xml 有的有这个值, 有的没有. 关键是怎么定位? 实际上他报错的是当前处理的xml element有问题, 而出错的时候盖住了要处理的. ...

  2. when case group by 的用法集合

    1.用那个以前大家都熟悉的例子,要求是依旧下面的表格求每个大洲的人口总和 国家(countrcoungry) 人口(population) 中国 600 美国 100 加拿大 100 英国 200 法 ...

  3. Loadrunner测试实例分析

    LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源.数据库服务器资源等几个方面分析,如图1 ...

  4. 数据库存入数据后id保持不变,或者直接报错

    数据库存入数据后id保持不变,且添加的数据一直在进行覆盖 或者直接报错 数据库存入数据后id保持不变,且添加的数据一直在进行覆盖 原因是: 之前注释掉了loadimage();在该函数中含有建立新的记 ...

  5. 如何隐藏js

    前端好像一直会遇到js容易被查看的问题,针对这种情况,如何隐藏js呢? 突发奇想,想到一个办法,如果说一段js只需要执行一次的话 可以尝试在所有js加载操作完毕后把它去掉.看代码 <!DOCTY ...

  6. Visual Studio 32位64位的问题和如何编译32位64位工程的问题

    Visual Studio自身没有32位和64位的分别,对于某一个特定的版本只有一个版本安装文件(即不存在32位版本的VS2015安装文件和64位版本的VS2015安装文件) 对于自己开发的工程,编译 ...

  7. Linux命令之乐--find

    find是命令行工具箱中最棒的命令之一. 列出当前目录及其子目录中的文件和文件夹. [root@LAMP WebRoot]# find . -print../index.jsp./upload.jsp ...

  8. 微信小程序-云开发(手记)

    微信小程序-云开发(手记) 1.创建data.json文件 注意以下几点要求: 入门示例: init方法的env:默认环境配置,传入字符串形式的环境 ID(理解为数据库)可以指定所有服务的默认环境(意 ...

  9. POI导出EXCEL经典实现(转载)

    1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...

  10. js功能实现的特效--距离新年还有多少天

    代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> & ...