python 规则引擎 drools_Drools 规则引擎环境搭建
一、关于 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 规则引擎环境搭建相关推荐
- Python+大数据-知行教育(一)-环境搭建 数据仓库
Python+大数据-知行教育(一)-环境搭建 数据仓库 1. 教育项目的数仓分层 回顾: 原有的基础分层 ODS层: 源数据层作用: 对接数据源, 和数据源的数据保持相同的粒度(将数据源的数据完整的 ...
- Python 网站开发(一)环境搭建
前些天看到小阳买回来的一本 Python 基础教程,于是就产生了使用 Python 来开发一个小博客的想法.这个 Python 网站开发系列文章将不会过多说 Python 基本语法,主要是面向实践的. ...
- #大数据技术#基于python的hadoop(单机)环境搭建及使用
基于python的hadoop(单机)环境搭建及使用 0.写在前面 1.虚拟机安装centos6.5 1.1安装流程 1.1.1系统安装 1.1.2修改静态ip(超级用户) 1.1.3更换可用源(超级 ...
- python 规则引擎 drools_Drools规则引擎入门demo
简单介绍 互联网旧系统维护中往往存在非常多的规则(比如:age < 16 || age > 50 -> REJECT ).最便捷的实现就是用 if-else 来写,但是随着规则的增加 ...
- python 规则引擎 drools_Drools规则引擎决策表使用场景
决策表是表示条件逻辑的"精确而紧凑"的方式,非常适合商业级别的规则. Drools支持以电子表格格式管理规则.支持的格式为Excel(XLS)和CSV,这意味着可以使用各种电子表格 ...
- Python学习笔记:Day1-2 开发环境搭建
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python爬虫系列(一)环境搭建,以及简单使用,体验他的强大
python初体验 python环境搭建 搭建过程中问题解决 工具安装 简单使用 强大的工具是开发的利器! 1.学习Python爬虫需要的python环境,Mac一般都自带了. 但是为了简单,上手更快 ...
- Selenium基于Python的web自动化测试框架(1)-环境搭建
环境搭建 前言 一.selenium简介 二.环境搭建 1. 笔者环境 2. Python安装 三. 验证安装是否成功 1. 打开win 命令行界面 2. 输入 python 回车,如果出现一下界面, ...
- Python自动化测试(01)自动化测试环境搭建
一.自动化测试环境搭建 请事先自行安装好Pycharm软件哦,我们本期整套教程的内容都是基于这款功能强大且跨平台的IDE讲解的哈. 1. 安装Python并配置环境变量 1.1 Python下载安装 ...
- python 3.6 + robotFramework自动化框架 环境搭建、学习笔记
目录 一.环境搭建 1.安装相关的库 2.pycharm 3.IntelliBot 4.pycharm配置执行器 5.fireFox浏览器及对应驱动 二.使用cmd执行 三.案例脚本(.robot文件 ...
最新文章
- Linux 部署ftp报530 错误解决方案
- python wxpython backend wxagg_[宜配屋]听图阁
- Qt 2D绘图功能简单总结
- Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件
- JavaWeb——eclipse与tomcat环境配置
- 关于DNF的多媒体包NPK文件的那些事儿(10) - SPK文件
- 计算机打开不显示桌面,电脑启动后不显示桌面怎么办
- PyQt5 给QLabel添加点击事件
- for(int i = 0;i 10;i++)和int i;for(i = 0;i 10;i++)
- 【个人管理】Nicholas C. Zakas:我得到的最佳职业生涯建议
- 2017CS231n李飞飞深度视觉识别笔记(二)——图像分类
- 波浪数,51nod1788,根号分治+Meet in the Middle
- Python PDF转高清图片 可设置转前几张
- 内部类基本操作(基础)
- kvm最多能管几台服务器,高效管理500台服务器的kvm切换器配置方案
- ApacheCN 编程/大数据/数据科学/人工智能学习资源 2019.11
- python彩蛋_隐藏在Python中的15个彩蛋
- mysql 索引超767_mysql Index column size too large 超过767错误解决方案(转)
- 提高网络服务器性能,优化网络的七条思路 帮您更快提高网络速度
- 攒机笔记二(cpu)
热门文章
- python爬虫淘宝评论_Python爬虫,抓取淘宝商品评论内容
- GPS NAME0183 详解
- 随机过程(4)——马尔可夫链
- chrome frame节点 取_Chrome Frame插件解决IE浏览器兼容问题
- 7.CCNA第七天-探索数据转发
- 如何在iPhone上安装Skype?
- python开发grasshopper插件_Rhino_Grasshopper_Python 开发的正确姿势
- mysql coreseek_关于mysql中文全文检索Sphinx之coreseek
- 网络克隆安装linux系统下载安装,pxe网刻工具_诚龙网刻教程_网络克隆安装windows7...
- Java5国际认证SCJP试题精解,Java 5国际认证SCJP试题精解