一、为什么要使用规则引擎

有一天运营想弄一个积分策略,计算额外积分金额 ,规则如下:

订单原价金额 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了相关推荐

  1. java排班_使用java规则引擎Drools自动排班前言.doc

    使用java规则引擎Drools自动排班前言 使用java规则引擎Drools自动排班前言本文以一个经简化的运输车队自动排班需求为例,详细讲解了如何使用java规则引擎Drools进行商业规则的形式语 ...

  2. 【Drools一】值得打工人学习的规则引擎Drools

    本文主要对Drools的使用业务场景做简单介绍. 规则引擎 规则引擎:全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System).规则引擎的主要思想是 ...

  3. 规则引擎drools系列(一)

    规则引擎 Drools 1. 问题引出 现有一个在线申请信用卡的业务场景,用户需要录入个人信息,如下图所示: //此处为伪代码 ​ //检查用户信息合法性,返回true表示检查通过,返回false表示 ...

  4. 规则引擎 Drools

    规则引擎 Drools 文章目录 规则引擎 Drools 1. 问题引出 2. 规则引擎概述 2.1 什么是规则引擎 2.2 使用规则引擎的优势 2.3 规则引擎应用场景 2.4 Drools介绍 3 ...

  5. 规则引擎——Drools

    Drools简介 Drools使用范例 语法介绍 名词解释 Drools简介   JBoss Rules 的前身是Codehaus的一个开源项目叫Drools.最近被纳入JBoss门下,更名为JBos ...

  6. 规则引擎Drools详细介绍

    规则引擎Drools详细介绍 一. 规则引擎概述 1.1 什么是规则引擎 1.2 使用规则引擎的优势 1.3 规则引擎应用场景 1.4 Drools介绍 二. Drools使用与说明 2.1 Droo ...

  7. 开源规则引擎 drools

    前言 在很多企业的 IT 业务系统中,经常会有大量的业务规则配置,而且随着企业管理者的决策变化,这些业务规则也会随之发生更改.为了适应这样的需求,我们的 IT 业务系统应该能快速且低成本的更新.适应这 ...

  8. Java开源的规则引擎 Drools 电商行业实战(含完整代码)

    前言 我所在项目组刚好接到一个领取优惠券需求,具体需求是用户领取的各种类型的优惠券(比如:代金券.折扣券)数量不能超过某个自定义数量,因考虑到领取限制数量是动态的,另外考虑到扩展性,满足将来业务规则的 ...

  9. 【转】什么是规则引擎(Drools、OpenL Tablets、Easy Rules、RuleBook)

    什么是规则引擎(Drools.OpenL Tablets.Easy Rules.RuleBook) 发表于:2021年1月23日 分类:Drools, 规则引擎 标签:Drools, Easy-Rul ...

最新文章

  1. POJ - 2337 Catenyms 欧拉回路
  2. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
  3. Oracle 自己主动内存管理 SGA、PGA 具体解释
  4. java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)
  5. 超牛逼的异步协程爬虫
  6. 网站主机和服务器选哪个,虚拟主机和服务器 你的网站该选择哪一个?
  7. hive表移到mysql_如何将Hive数据表移动到MySql?
  8. 两张图告诉你tnsnames.ora 的配置详解
  9. sql 拆解函数_在SQL Server数据库中拆分字符串函数
  10. tp5 前台 点击显示一个弹窗
  11. java线程状态、新建状态、运行状态、阻塞状态、等待阻塞、同步阻塞、其他阻塞、死亡状态
  12. pdf分页分片预览,pdf截取,pdf转图片
  13. Text file busy解决方法
  14. Mongodb- paly中操作mongodb记录
  15. typescript关键词Parameters和ReturnType
  16. 计算机组成原理实验一 运算器实验
  17. 短视频在线去水印 视频伪原创批量处理工具
  18. Spring Cloud Data Flow流处理入门-5
  19. IIS伪静态URL重写规则入门
  20. 微信小程序promise接口封装

热门文章

  1. HANA S/4 标准表(MARC MBEW COBL)增强流程
  2. 波斯语计算机语言,语言「波斯语」10句及词汇
  3. ajax-jq-php(mysql)四级省市级联
  4. java商城毕业设计 JavaWeb家具家居购物商城毕业设计(10)下单结算
  5. Bentley OpenFlows FLOOD 集成的洪水模拟软件
  6. 数据压缩课程作业——LZW压缩算法完整仿真代码和分析
  7. 【历史上的今天】8 月 22 日:改变世界的程序员们
  8. 天阔服务器用户名密码,曙光天阔服务器远程控制手册.doc
  9. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day5,java面向对象程序设计教程课后答案
  10. codeforces1119B. Alyona and a Narrow Fridge 贪心