别再说你不会,规则引擎Drools了
一、为什么要使用规则引擎
有一天运营想弄一个积分策略,计算额外积分金额 ,规则如下:
订单原价金额 100以下, 不加分;
100-500 加100分;
500-1000 加500分;
1000 以上 加1000分;
传统java业务实现如下:
public class JavaScoreExample {public static void main(String[] args) throws Exception { List<Order> orderList = getInitData();for (int i=0; i<orderList.size(); i++){ Order order = orderList.get(i); if (order.getAmout() <= 100){ order.setScore(0); addScore(order); }else if(order.getAmout() > 100 && order.getAmout() <= 500){ order.setScore(100); addScore(order); }else if(order.getAmout() > 500 && order.getAmout() <= 1000){ order.setScore(500); addScore(order); }else{ order.setScore(1000); addScore(order); } } } private static void addScore(Order o){ System.out.println("用户" + o.getUser().getName() + "享受额外增加积分: " + o.getScore()); } private static List<Order> getInitData() throws Exception { List<Order> orderList = new ArrayList<Order>();DateFormat df = new SimpleDateFormat("yyyy-MM-dd");{Order order = new Order(); order.setAmout(80); order.setBookingDate(df.parse("2015-07-01")); User user = new User();user.setLevel(1); user.setName("Name1"); order.setUser(user); orderList.add(order); }{Order order = new Order(); order.setAmout(200); order.setBookingDate(df.parse("2015-07-02")); User user = new User();user.setLevel(2); user.setName("Name2"); order.setUser(user); orderList.add(order); } return orderList; }
}
这时候由于市场需求变化,又要调整规则时候,则又要进行业务层面的代码修改、部署,十分麻烦。
如果我们可以把决策规则从应用程序中分离出来,将对系统提供很大的便利!
由此,诞生了规则引擎!如下如所示:
规则引擎优势:
对系统的使用人员
把业务策略(规则)的创建、修改和维护的权利交给业务经理
提高业务灵活性
加强业务处理的透明度,业务规则可以被管理
减少对IT人员的依赖程度
避免将来升级的风险
对IT开发人员
简化系统架构,优化应用
提高系统的可维护性和维护成本
方便系统的整合
减少编写“硬代码”业务规则的成本和风险
目前市面上比较热门的规则引擎有几款:
Ilog JRules 是最有名的商用BRMS;
Drools 是最活跃的开源规则引擎;
Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表;
Visual Rules(旗正规则引擎)国内商业规则引擎品牌。
本文将着重介绍Drools。
二、什么是Drools
Drools 是一个基于Charles Forgy’s的RETE算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。
业务分析师人员或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
Drools 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声明方式表达业务逻辑。可以使用非XML的本地语言编写规则,从而便于学习和理解。并且,还可以将Java代码直接嵌入到规则文件中,这令Drools的学习更加吸引人。
三、Drools 实战
下面我们将使用drools 把一部分中计算额外积分金额 规则从代码中剥离出来:
github 传送门:https://github.com/vincent9309/drools:
1、引入pom文件
<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.0.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.0.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>7.0.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>7.0.0.Final</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>7.0.0.Final</version></dependency>
2、 在src/main/resources/ruls 新建Point-rules.drl规则文件:
package rulesimport com.neo.drools.entity.Orderrule "zero"no-loop truelock-on-active truesalience 1when$s : Order(amout <= 100)then$s.setScore(0);update($s);
endrule "add100"no-loop truelock-on-active truesalience 1when$s : Order(amout > 100 && amout <= 500)then$s.setScore(100);update($s);
endrule "add500"no-loop truelock-on-active truesalience 1when$s : Order(amout > 500 && amout <= 1000)then$s.setScore(500);update($s);
endrule "add1000"no-loop truelock-on-active truesalience 1when$s : Order(amout > 1000)then$s.setScore(1000);update($s);
end
3、src/main/resources/META-INF新建配置文件kmodule.xml:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.drools.org/xsd/kmodule"><kbase name="point-rulesKB" packages="rules"><ksession name="point-rulesKS"/></kbase><kbase name="HelloWorldKB" packages="rules"><ksession name="HelloWorldKS"/></kbase></kmodule>
4、最后在程序中调用规则,即可实现:
/*** 计算额外积分金额 规则如下: 订单原价金额* 100以下, 不加分* 100-500 加100分* 500-1000 加500分* 1000 以上 加1000分** @param args* @throws Exception*/public static final void main(final String[] args) throws Exception{// KieServices is the factory for all KIE servicesKieServices ks = KieServices.Factory.get();// From the kie services, a container is created from the classpathKieContainer kc = ks.getKieClasspathContainer();execute( kc );}public static void execute( KieContainer kc ) throws Exception{// From the container, a session is created based on// its definition and configuration in the META-INF/kmodule.xml fileKieSession ksession = kc.newKieSession("point-rulesKS");List<Order> orderList = getInitData();for (int i = 0; i < orderList.size(); i++) {Order o = orderList.get(i);ksession.insert(o);ksession.fireAllRules();// 执行完规则后, 执行相关的逻辑addScore(o);}ksession.dispose();}private static void addScore(Order o){ System.out.println("用户" + o.getUser().getName() + "享受额外增加积分: " + o.getScore()); } private static List<Order> getInitData() throws Exception { List<Order> orderList = new ArrayList<Order>();DateFormat df = new SimpleDateFormat("yyyy-MM-dd");{ Order order = new Order(); order.setAmout(80); order.setBookingDate(df.parse("2015-07-01")); User user = new User(); user.setLevel(1); user.setName("Name1"); order.setUser(user);order.setScore(111);orderList.add(order); } { Order order = new Order(); order.setAmout(200); order.setBookingDate(df.parse("2015-07-02")); User user = new User(); user.setLevel(2); user.setName("Name2"); order.setUser(user); orderList.add(order); } return orderList; }
结果输出:
总结:
应用场景
· 为提高效率,管理流程必须自动化,尽管现代商业规则异常复杂。
· 市场要求业务规则经常变化,系统必须依据业务规则的变化快速、低成本的更新。
· 为了快速、低成本的更新,业务人员应能直接管系统中的规则,不需要程序开发人员参与。
作用与优点:
· 将业务规则与业务系统分离,解耦合;
· 实现自然语言描述规则逻辑,业务人员易于理解;
· 可视化的规则定制、审批、查询及管理;
· 能有效的提高实现复杂逻辑的代码的可维护性;
· 应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内;
· 符合组织对敏捷或迭代开发过程的使用;
下文将继续讲解,drools基础语法,以及使用springboot 集成drools企业级开发,并实现热加载规则!
传送门:《规则引擎Drools 之 springboot 集成、热加载》
别再说你不会,规则引擎Drools了相关推荐
- java排班_使用java规则引擎Drools自动排班前言.doc
使用java规则引擎Drools自动排班前言 使用java规则引擎Drools自动排班前言本文以一个经简化的运输车队自动排班需求为例,详细讲解了如何使用java规则引擎Drools进行商业规则的形式语 ...
- 【Drools一】值得打工人学习的规则引擎Drools
本文主要对Drools的使用业务场景做简单介绍. 规则引擎 规则引擎:全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System).规则引擎的主要思想是 ...
- 规则引擎drools系列(一)
规则引擎 Drools 1. 问题引出 现有一个在线申请信用卡的业务场景,用户需要录入个人信息,如下图所示: //此处为伪代码 //检查用户信息合法性,返回true表示检查通过,返回false表示 ...
- 规则引擎 Drools
规则引擎 Drools 文章目录 规则引擎 Drools 1. 问题引出 2. 规则引擎概述 2.1 什么是规则引擎 2.2 使用规则引擎的优势 2.3 规则引擎应用场景 2.4 Drools介绍 3 ...
- 规则引擎——Drools
Drools简介 Drools使用范例 语法介绍 名词解释 Drools简介 JBoss Rules 的前身是Codehaus的一个开源项目叫Drools.最近被纳入JBoss门下,更名为JBos ...
- 规则引擎Drools详细介绍
规则引擎Drools详细介绍 一. 规则引擎概述 1.1 什么是规则引擎 1.2 使用规则引擎的优势 1.3 规则引擎应用场景 1.4 Drools介绍 二. Drools使用与说明 2.1 Droo ...
- 开源规则引擎 drools
前言 在很多企业的 IT 业务系统中,经常会有大量的业务规则配置,而且随着企业管理者的决策变化,这些业务规则也会随之发生更改.为了适应这样的需求,我们的 IT 业务系统应该能快速且低成本的更新.适应这 ...
- Java开源的规则引擎 Drools 电商行业实战(含完整代码)
前言 我所在项目组刚好接到一个领取优惠券需求,具体需求是用户领取的各种类型的优惠券(比如:代金券.折扣券)数量不能超过某个自定义数量,因考虑到领取限制数量是动态的,另外考虑到扩展性,满足将来业务规则的 ...
- 【转】什么是规则引擎(Drools、OpenL Tablets、Easy Rules、RuleBook)
什么是规则引擎(Drools.OpenL Tablets.Easy Rules.RuleBook) 发表于:2021年1月23日 分类:Drools, 规则引擎 标签:Drools, Easy-Rul ...
最新文章
- POJ - 2337 Catenyms 欧拉回路
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
- Oracle 自己主动内存管理 SGA、PGA 具体解释
- java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)
- 超牛逼的异步协程爬虫
- 网站主机和服务器选哪个,虚拟主机和服务器 你的网站该选择哪一个?
- hive表移到mysql_如何将Hive数据表移动到MySql?
- 两张图告诉你tnsnames.ora 的配置详解
- sql 拆解函数_在SQL Server数据库中拆分字符串函数
- tp5 前台 点击显示一个弹窗
- java线程状态、新建状态、运行状态、阻塞状态、等待阻塞、同步阻塞、其他阻塞、死亡状态
- pdf分页分片预览,pdf截取,pdf转图片
- Text file busy解决方法
- Mongodb- paly中操作mongodb记录
- typescript关键词Parameters和ReturnType
- 计算机组成原理实验一 运算器实验
- 短视频在线去水印 视频伪原创批量处理工具
- Spring Cloud Data Flow流处理入门-5
- IIS伪静态URL重写规则入门
- 微信小程序promise接口封装
热门文章
- HANA S/4 标准表(MARC MBEW COBL)增强流程
- 波斯语计算机语言,语言「波斯语」10句及词汇
- ajax-jq-php(mysql)四级省市级联
- java商城毕业设计 JavaWeb家具家居购物商城毕业设计(10)下单结算
- Bentley OpenFlows FLOOD 集成的洪水模拟软件
- 数据压缩课程作业——LZW压缩算法完整仿真代码和分析
- 【历史上的今天】8 月 22 日:改变世界的程序员们
- 天阔服务器用户名密码,曙光天阔服务器远程控制手册.doc
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day5,java面向对象程序设计教程课后答案
- codeforces1119B. Alyona and a Narrow Fridge 贪心