QLExpress入门

介绍:

QLExpress 是一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用。
规则引擎和流程引擎一起,是使用在大规模复杂业务场景下必备的业务框架技术,使用这两门技术搭建起来的系统能够很好的梳理清楚业务逻辑,并且方便快速的修改业务逻辑,甚至可以做到需求的实时生效。

规则引擎最大的价值就在于通过以下的三个过程,大大的缓解了频繁的需求变化给整个业务系统带来的灾难。

  1. 逼迫系统开发人员和业务专家梳理业务,定义统一的BOM(业务对象模型)。
  2. 业务专家可以快速的制定修改规则,然后交由规则引擎自动化地来处理分析。
  3. 规则引擎代替系统开发人员,解决由规则条件关联动作变化带来的开发工作。

相关文档:

https://yq.aliyun.com/articles/621206/

下面写一个例子,简单展示下它的使用
1:项目结构如图所示

2.详细代码
首先导入jar包

     <dependency><groupId>com.alibaba</groupId><artifactId>QLExpress</artifactId><version>3.2.0</version></dependency>
  • 实体类
import lombok.Data;/*** @author:Zhr date:2021/12/9  16:08* @desc:人员类,包含基本信息*/
@Data
public class QlPerson {private String name;private Integer age;private Integer sex;
}
  • 规则枚举类
import lombok.AllArgsConstructor;
import lombok.Getter;/*** @author:Zhr date:2021/12/9  16:03* @desc:基础规则枚举类*/
@AllArgsConstructor
public enum ConditionEnum {MALE("是男性","性别为男(person,1)"),FEMALE("是女性","性别为男(person,0)"),OVER60("年龄达到60岁","是否达到退休年龄(person,60)"),OVER50("年龄达到50岁","是否达到退休年龄(person,50)");@Getterprivate String macroName;@Getterprivate String express;
}
  • 测试主类
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import lombok.Data;import java.util.ArrayList;
import java.util.List;/*** @author:Zhr date:2021/12/9  15:54* @desc:测试类*/
@Data
public class QlExpTest {public static ExpressRunner expressRunner;static {//将加载规则等相关初始化工作放在static代码块中,保证规则先加载完毕,也可以写个初始化方法,先执行init方法也可以try{//构造执行器expressRunner = new ExpressRunner();//添加规则expressRunner.addOperatorWithAlias("如果","if",null);expressRunner.addOperatorWithAlias("则","then",null);expressRunner.addOperatorWithAlias("否则","else",null);expressRunner.addOperatorWithAlias("或者","or",null);expressRunner.addOperatorWithAlias("并且","and",null);//注册自定义方法expressRunner.addFunctionOfClassMethod("性别为男",QlExpTest.class.getName(),"isBoy",new Class[]{QlPerson.class,int.class},null);expressRunner.addFunctionOfClassMethod("是否达到退休年龄",QlExpTest.class.getName(),"isOver60",new Class[]{QlPerson.class,int.class},null);//从枚举类里加载规则对应自定义方法,与上面的定义方法步骤一定要按照顺序不可颠倒否则会报Runner找不到XX规则或XXX自定义方法(这一步也可如下方注释一样添加)for (ConditionEnum conditionEnum: ConditionEnum.values()){expressRunner.addMacro(conditionEnum.getMacroName(), conditionEnum.getExpress());}/*       expressRunner.addMacro("是男性","性别为男(person,1)");expressRunner.addMacro("是女性","性别为男(person,0)");expressRunner.addMacro("年龄达到60岁","是否达到退休年龄(person,60)");expressRunner.addMacro("年龄达到50岁","是否达到退休年龄(person,50)");*/}catch (Exception e){e.printStackTrace();}}//自定义方法判断是否为男性public  boolean isBoy(QlPerson person,int sex){if(person.getSex()==sex)return true;return false;}//自定义方法判断年龄public  boolean isOver60(QlPerson person, int age){if(person.getAge()>age)return true;return false;}//判断方法,传入参数和规则public static void judge(QlPerson person, String express) throws Exception {IExpressContext<String,Object> expressContext = new DefaultContext<>();expressContext.put("person",person);List<String> errorInfo = new ArrayList<>();//执行Object result = expressRunner.execute(express, expressContext, errorInfo, false, false);System.out.println("result"+result);}//测试public static void main(String[] args) throws Exception {//模板规则 会根据此规则进行解析执行(通过读文件或读库方式加载,让产品自己来写规则)String exp = "如果((是男性 并且 年龄达到60岁) 或者 (是女性 并且 年龄达到50岁))" +" 则 {return '休息';} " + "否则 {return '工作';}";QlPerson person = new QlPerson();person.setSex(1);person.setName("zs");person.setAge(59);judge(person,exp);}
}

执行结果

改变参数1 ,65

QLExpress初探相关推荐

  1. 2021年大数据Flink(九):Flink原理初探

    Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...

  2. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书

    缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...

  3. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  4. las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...

    引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...

  5. 2018-4-15摘录笔记,《网络表征学习前沿与实践》 崔鹏以及《网络表征学习中的基本问题初探》 王啸 崔鹏 朱文武

    1.来源:<网络表征学习前沿与实践>  崔鹏 (1)随着数据的增加以及计算机计算速度的增加,想当然的以为速度快了,数据再多也是可以自己算的,但是若是数据之间存在着复杂的关系,那么处理一个样 ...

  6. python argparse_Python 命令行之旅:初探 argparse

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...

  7. HTML5+MUI+HBuilder 之初探情人

    07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪.爆炸式的崛 ...

  8. 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探

    2019独角兽企业重金招聘Python工程师标准>>> 用意: 希望了解Mahout中数据的存储方式, 它如何避免java object带来的冗余开销.学完知识,要进行些实战 去分析 ...

  9. SAP RETAIL 补货类型RF之初探 II

    SAP RETAIL 补货类型RF之初探 II 1, 补货参数 – TargetCoverage字段不能为空. 如果不维护这个参数值,系统会提示:Target stock calculated dyn ...

最新文章

  1. Airflow安装部署
  2. c语言贪吃蛇编写分析,刚学C语言,想写一个贪吃蛇的代码
  3. 为什么人们爱听有声书?
  4. CSP认证201509-1 数列分段[C++题解]:遍历
  5. groupby索引有效吗_面试官:MySQL建索引需要遵循哪些原则呢?
  6. Android开发——RecyclerView特性以及基本使用方法(二)
  7. 全国计算机等级考试题库二级C操作题100套(第07套)
  8. hadoop概念介绍
  9. 大神干货:算法高手郭大顶级经验分享助你轻松通过初赛!
  10. LeetCode 392 判断子序列
  11. ZUST-CCCC选拔赛(L1,L2部分题解)
  12. input里面check 状态检测
  13. C++之printf格式
  14. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类...
  15. 左倾红黑树(Left-Leaning Red-Black Trees:LLRBT)解析
  16. 影视剪辑,剪了这么久视频,还不知道pr剪辑的这些快捷键
  17. LC.1175. Prime Arrangements
  18. Java中的数组注意点
  19. 流,向量场,和微分方程
  20. cs起源本地服务器无响应,CS起源上为什么我无法进入有反作

热门文章

  1. artTemplate 引入模板页
  2. css设置全局滚动条样式
  3. 数字化时代商业银行客户触达策略研究 从数据到服务 由场景到生态
  4. 冯小刚贺岁片十大经典台词
  5. 皮卡丘为什么不进化_为何皮卡丘没有进化成雷丘?本篇告诉你答案
  6. Mybatis3快速上手(详细)
  7. 决胜移动互联网 网址导航迎来新曙光
  8. TensorFlow框架学习笔记
  9. Mac OS X的剪切操作
  10. 微信分享海报、头像、图片、二维码合成(java)