QLExpress初探
QLExpress入门
介绍:
QLExpress 是一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用。
规则引擎和流程引擎一起,是使用在大规模复杂业务场景下必备的业务框架技术,使用这两门技术搭建起来的系统能够很好的梳理清楚业务逻辑,并且方便快速的修改业务逻辑,甚至可以做到需求的实时生效。
规则引擎最大的价值就在于通过以下的三个过程,大大的缓解了频繁的需求变化给整个业务系统带来的灾难。
- 逼迫系统开发人员和业务专家梳理业务,定义统一的BOM(业务对象模型)。
- 业务专家可以快速的制定修改规则,然后交由规则引擎自动化地来处理分析。
- 规则引擎代替系统开发人员,解决由规则条件关联动作变化带来的开发工作。
相关文档:
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初探相关推荐
- 2021年大数据Flink(九):Flink原理初探
Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...
- 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书
缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...
引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...
- 2018-4-15摘录笔记,《网络表征学习前沿与实践》 崔鹏以及《网络表征学习中的基本问题初探》 王啸 崔鹏 朱文武
1.来源:<网络表征学习前沿与实践> 崔鹏 (1)随着数据的增加以及计算机计算速度的增加,想当然的以为速度快了,数据再多也是可以自己算的,但是若是数据之间存在着复杂的关系,那么处理一个样 ...
- python argparse_Python 命令行之旅:初探 argparse
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...
- HTML5+MUI+HBuilder 之初探情人
07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪.爆炸式的崛 ...
- 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探
2019独角兽企业重金招聘Python工程师标准>>> 用意: 希望了解Mahout中数据的存储方式, 它如何避免java object带来的冗余开销.学完知识,要进行些实战 去分析 ...
- SAP RETAIL 补货类型RF之初探 II
SAP RETAIL 补货类型RF之初探 II 1, 补货参数 – TargetCoverage字段不能为空. 如果不维护这个参数值,系统会提示:Target stock calculated dyn ...
最新文章
- Airflow安装部署
- c语言贪吃蛇编写分析,刚学C语言,想写一个贪吃蛇的代码
- 为什么人们爱听有声书?
- CSP认证201509-1	数列分段[C++题解]:遍历
- groupby索引有效吗_面试官:MySQL建索引需要遵循哪些原则呢?
- Android开发——RecyclerView特性以及基本使用方法(二)
- 全国计算机等级考试题库二级C操作题100套(第07套)
- hadoop概念介绍
- 大神干货:算法高手郭大顶级经验分享助你轻松通过初赛!
- LeetCode 392 判断子序列
- ZUST-CCCC选拔赛(L1,L2部分题解)
- input里面check 状态检测
- C++之printf格式
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类...
- 左倾红黑树(Left-Leaning Red-Black Trees:LLRBT)解析
- 影视剪辑,剪了这么久视频,还不知道pr剪辑的这些快捷键
- LC.1175. Prime Arrangements
- Java中的数组注意点
- 流,向量场,和微分方程
- cs起源本地服务器无响应,CS起源上为什么我无法进入有反作