QLExpress使用及源码分析

简介: QLExpress是阿里开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑解耦。基于AST语法树解析,提供上下文绑定、动态脚本执行与缓存机制,适用于复杂条件判断与计算场景,如BMI计算、用户规则校验等,具备高扩展性与易维护性。

Git仓库:https://github.com/alibaba/QLExpress
1.示例Demo
1.实体构建
@Data
public class User {

@QLAlias("姓名")
private String name;

@QLAlias("年龄")
private Integer age;

@QLAlias("性别")
private String gender;

@QLAlias("身高")
private Double height;

@QLAlias("体重")
private Double weight;

}
2.接口定义
@Service(value = "userManagerImpl")
public class UserManagerImpl implements UserManager {

... ...

@Override
@QLRule("isAdult")
public Boolean isAdult(@QLAlias("用户") User user) {
throw new RuntimeException("不应该走到这里");
}

@Override
@QLRule
public BMIResult calculate(@QLAlias("用户") User user) {
throw new RuntimeException("不应该走到这里");
}
}
3.脚本编写
表达式内容维护在一个yaml里,默认扫描路径为:classpath:/rules/**/.yaml
这里为:user.yaml
// 对应上述接口1
isAdult:
用户.年龄 >= 18

// 对应上述接口2
com.test.UserManagerImpl.calculate: |
import com.test.Result;
bmiResult = new Result();
bmiValue = 用户.体重 / (患者.身高 * 患者.身高);
bmiResult.setBmiValue(bmiValue);
if (bmiValue < 18.5) {
bmiResult.setMsg("体重过低");
} else if (bmiValue > 23.9) {
bmiResult.setMsg("体重过高");
} else {
bmiResult.setMsg("体重正常");
}
return bmiResult;
2.运行环节
QLExpressRunner如下图所示,从语法树分析、上下文、执行过程三个方面提供二次定制的功能扩展。

1.获取原始脚本,参数
● QLRule中的value可以使用缺省值,对应yaml的key则为缺省值对应的ruleCode
● 存在默认读取文件路径:com.c2f.boot.starter.rule.engine.QLExpressProperties
● String rule为获取的原始脚本,后续基于此构建AST语法树

2.构建后续赋值上下文
● 没取别名,默认构建一组:形参:value
● 取别名,另构建一组:别名:value(后续yaml能汉化使用也是基于此)
● 所以默认构建的上下文数量 = 形参个数 1,有别名 = 形参个数 2

3.调用执行

延迟执行

默认第一次执行即缓存

构建AST语法树
基于:com.ql.util.express.parse.KeyWordDefine4Java 构建
选择匹配工厂

递归解析
分解为Word[]:"sum",”=“,”0“,”;“,"for","(","i",......
Word[]转化为List《ExpressNode》:每一个word变得有意义:常量、变量、符号、分割符号

解析第一行:请领状态 = 药品请领单.执行状态

解析第二行:执行计划状态 = 执行计划.当前执行状态,clearDataStack后续也会当做一个指令使用

解析第三行,不再是loadAttr而是LoadData
或需是引包则loadData,变量定义是LoadAttr,未研究

真正执行

基于不同指令进入不同的重写方法

清除栈内数据

执行完毕返回

相关文章
|
3月前
|
人工智能 JSON Java
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
AI时代下,规则引擎的需求反而更旺盛。QLExpress4 通过全面重构,在性能、可观测性和AI友好性上大幅提升。
1227 15
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
|
测试技术
JMeter 随机数生成器详细指南:利用 Random 和 UUID 实现
在压力测试中,经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值,本文来具体介绍一下。
|
SQL XML 关系型数据库
Mybatis-Plus通过SQL注入器实现真正的批量插入
Mybatis-Plus通过SQL注入器实现真正的批量插入
7560 0
Mybatis-Plus通过SQL注入器实现真正的批量插入
|
2月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过YAML配置表达式规则。支持AST语法树解析、上下文构建与动态执行,提供脚本缓存、别名映射、指令重写等扩展能力,适用于灵活的业务逻辑解耦与动态化控制。
|
druid Java 数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
druid+springboot加解密Druid链接池配置加密密码链接数据库
1512 0
SpringBoot使用ProxyServlet实现HTTP反向代理
SpringBoot使用ProxyServlet实现HTTP反向代理
2047 0
|
Web App开发 前端开发 Android开发
前端预览PDF文件(使用PDFJS)
我准备出一篇文章来介绍一下如何使用 PDFJS 。
2459 0
前端预览PDF文件(使用PDFJS)
|
9月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
12120 33
MCP客户端调用看这一篇就够了(Java版)
|
10月前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。

热门文章

最新文章