一、关于 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中可以包含一个到多个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 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。

四、附录

python 规则引擎 drools_Drools 规则引擎环境搭建相关推荐

  1. Python+大数据-知行教育(一)-环境搭建 数据仓库

    Python+大数据-知行教育(一)-环境搭建 数据仓库 1. 教育项目的数仓分层 回顾: 原有的基础分层 ODS层: 源数据层作用: 对接数据源, 和数据源的数据保持相同的粒度(将数据源的数据完整的 ...

  2. Python 网站开发(一)环境搭建

    前些天看到小阳买回来的一本 Python 基础教程,于是就产生了使用 Python 来开发一个小博客的想法.这个 Python 网站开发系列文章将不会过多说 Python 基本语法,主要是面向实践的. ...

  3. #大数据技术#基于python的hadoop(单机)环境搭建及使用

    基于python的hadoop(单机)环境搭建及使用 0.写在前面 1.虚拟机安装centos6.5 1.1安装流程 1.1.1系统安装 1.1.2修改静态ip(超级用户) 1.1.3更换可用源(超级 ...

  4. python 规则引擎 drools_Drools规则引擎入门demo

    简单介绍 互联网旧系统维护中往往存在非常多的规则(比如:age < 16 || age > 50 -> REJECT ).最便捷的实现就是用 if-else 来写,但是随着规则的增加 ...

  5. python 规则引擎 drools_Drools规则引擎决策表使用场景

    决策表是表示条件逻辑的"精确而紧凑"的方式,非常适合商业级别的规则. Drools支持以电子表格格式管理规则.支持的格式为Excel(XLS)和CSV,这意味着可以使用各种电子表格 ...

  6. Python学习笔记:Day1-2 开发环境搭建

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python爬虫系列(一)环境搭建,以及简单使用,体验他的强大

    python初体验 python环境搭建 搭建过程中问题解决 工具安装 简单使用 强大的工具是开发的利器! 1.学习Python爬虫需要的python环境,Mac一般都自带了. 但是为了简单,上手更快 ...

  8. Selenium基于Python的web自动化测试框架(1)-环境搭建

    环境搭建 前言 一.selenium简介 二.环境搭建 1. 笔者环境 2. Python安装 三. 验证安装是否成功 1. 打开win 命令行界面 2. 输入 python 回车,如果出现一下界面, ...

  9. Python自动化测试(01)自动化测试环境搭建

    一.自动化测试环境搭建 请事先自行安装好Pycharm软件哦,我们本期整套教程的内容都是基于这款功能强大且跨平台的IDE讲解的哈. 1. 安装Python并配置环境变量 1.1 Python下载安装 ...

  10. python 3.6 + robotFramework自动化框架 环境搭建、学习笔记

    目录 一.环境搭建 1.安装相关的库 2.pycharm 3.IntelliBot 4.pycharm配置执行器 5.fireFox浏览器及对应驱动 二.使用cmd执行 三.案例脚本(.robot文件 ...

最新文章

  1. Linux 部署ftp报530 错误解决方案
  2. python wxpython backend wxagg_[宜配屋]听图阁
  3. Qt 2D绘图功能简单总结
  4. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件
  5. JavaWeb——eclipse与tomcat环境配置
  6. 关于DNF的多媒体包NPK文件的那些事儿(10) - SPK文件
  7. 计算机打开不显示桌面,电脑启动后不显示桌面怎么办
  8. PyQt5 给QLabel添加点击事件
  9. for(int i = 0;i 10;i++)和int i;for(i = 0;i 10;i++)
  10. 【个人管理】Nicholas C. Zakas:我得到的最佳职业生涯建议
  11. 2017CS231n李飞飞深度视觉识别笔记(二)——图像分类
  12. 波浪数,51nod1788,根号分治+Meet in the Middle
  13. Python PDF转高清图片 可设置转前几张
  14. 内部类基本操作(基础)
  15. kvm最多能管几台服务器,高效管理500台服务器的kvm切换器配置方案
  16. ApacheCN 编程/大数据/数据科学/人工智能学习资源 2019.11
  17. python彩蛋_隐藏在Python中的15个彩蛋
  18. mysql 索引超767_mysql Index column size too large 超过767错误解决方案(转)
  19. 提高网络服务器性能,优化网络的七条思路 帮您更快提高网络速度
  20. 攒机笔记二(cpu)

热门文章

  1. python爬虫淘宝评论_Python爬虫,抓取淘宝商品评论内容
  2. GPS NAME0183 详解
  3. 随机过程(4)——马尔可夫链
  4. chrome frame节点 取_Chrome Frame插件解决IE浏览器兼容问题
  5. 7.CCNA第七天-探索数据转发
  6. 如何在iPhone上安装Skype?
  7. python开发grasshopper插件_Rhino_Grasshopper_Python 开发的正确姿势
  8. mysql coreseek_关于mysql中文全文检索Sphinx之coreseek
  9. 网络克隆安装linux系统下载安装,pxe网刻工具_诚龙网刻教程_网络克隆安装windows7...
  10. Java5国际认证SCJP试题精解,Java 5国际认证SCJP试题精解