QLExpress使用及源码分析

简介: QLExpress是阿里开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑解耦。通过@QLAlias、@QLRule等注解定义规则接口,结合AST语法树解析与上下文执行,实现动态脚本编译与缓存,适用于复杂条件判断与动态计算场景,具备高扩展性与易维护性。

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,未研究

真正执行

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

清除栈内数据

执行完毕返回

相关文章
|
6月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过YAML配置表达式规则。支持AST语法树解析、上下文构建与动态执行,提供脚本缓存、别名映射、指令重写等扩展能力,适用于灵活的业务逻辑解耦与动态化控制。
|
7月前
|
人工智能 JSON Java
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
AI时代下,规则引擎的需求反而更旺盛。QLExpress4 通过全面重构,在性能、可观测性和AI友好性上大幅提升。
2167 15
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
|
3月前
|
人工智能 自然语言处理 API
从养龙虾到管龙虾:OpenClaw+DeerFlow2 可控智能体落地|阿里云+本地部署+大模型配置指南
在AI智能体快速普及的今天,OpenClaw(Clawdbot)凭借自然语言驱动、自动任务拆解、工具调用与开箱即用的体验,被大量用户称作“养龙虾”。但在科研、实验室、数据处理等真实生产场景中,单纯“能跑起来”远远不够:流程不可控、结果不稳定、出错难追溯、数据无法本地化,使得智能体难以真正落地。
1845 0
|
4月前
|
人工智能 安全 JavaScript
Claude Code 中的 Commands、Skills 与 Agents:不是进阶路径,而是协作维度
本文澄清Claude Code中Commands、Skills、Agents并非线性进阶关系,而是面向不同协作粒度的互补机制:Commands用于即时原子操作,Skills封装可复用专业能力,Agents承担目标导向的自主任务。三者构成“协作三角”,应依任务复杂度灵活选用或组合,核心是扩展而非替代人类能力。(239字)
2707 8
|
时序数据库
influxDB时序数据库2.0FLUX查询语法使用记录
influxDB时序数据库2.0FLUX查询语法使用记录
|
Java
IDEA 2022 SpringBoot启动 (Services) Run Dashboard 不显示 端口号
IDEA 2022 SpringBoot启动 (Services) Run Dashboard 不显示 端口号
5550 0
IDEA 2022 SpringBoot启动 (Services) Run Dashboard 不显示 端口号
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
14543 1
|
5月前
|
存储 弹性计算 应用服务中间件
现在阿里云服务器打几折?2026年阿里云服务器优惠活动解析:购买、续费与升级指南
阿里云服务器针对不同用户群体,如个人开发者、企业用户、学生等,推出了差异化的优惠政策,核心围绕 “购买低价、续费稳定、升级灵活” 设计,帮助用户在服务器使用的全生命周期内控制成本。下面将结合最新规则,详细解读购买优惠、续费折扣、升级政策及适用场景,为不同需求的用户提供客观的成本优化参考。
|
人工智能 开发者
通义千问三款主力模型再降价,最高降幅85%
通义千问三款主力模型再降价,最高降幅85%
7620 12
通义千问三款主力模型再降价,最高降幅85%
|
JSON 前端开发 Java
SpringBoot - 优雅解决 SpringBoot 在 JDK8 中 LocalDateTime(反)序列化问题
SpringBoot - 优雅解决 SpringBoot 在 JDK8 中 LocalDateTime(反)序列化问题
1468 0

热门文章

最新文章