QLExpress使用及源码分析

简介: QLExpress是阿里巴巴开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑与代码解耦。提供AST语法树解析、上下文构建及高效执行机制,适用于动态规则场景。GitHub地址:https://github.com/alibaba/QLExpress

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

真正执行

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

清除栈内数据

执行完毕返回


相关文章
|
SQL 存储 缓存
面向异构数据的Schema-on-Read分析技术设计与实践
本文是12月4号在《DataFunTalk技术交流会:阿里云实时查询分析专场》分享的议题《面向异构数据的Schema-on-Read分析技术与实践》的文字版记录。一、背景介绍数字化转型浪潮中,物理世界到数字世界的映射带来了各种各样结构的数据。第一种是完全无结构的数据,完全没有任何规律,典型的如syslog这种记录系统事件的日志;第二种是半结构化数据,有局部的结构,但是不同的行的字段的数目是不确定的
20509 3
面向异构数据的Schema-on-Read分析技术设计与实践
|
新零售 Java C++
java脚本引擎的设计原理浅析
本人在阿里巴巴长期担任和负责规则引擎、流程引擎相关的技术开发,另外还负责开发和维护开源项目:https://github.com/alibaba/QLExpress QLExpress是一个脚本引擎工具,类似Groovy,JRuby等,是为了解决当时电商规则动态编译、表达式高精度计算、复杂布尔运算、自定义函数和操作符号、语法树生成等需求而设计的。
17270 0
|
9月前
|
存储 弹性计算 Cloud Native
2026年最新一期阿里云优惠券解析:五种主要优惠券类型、金额、领取及使用规则讲解
为了进一步降低用户的上云成本,2026年阿里云继续推出多种优惠券,以助力用户轻松实现数字化转型。本文将全面介绍阿里云目前提供的五种主要优惠券类型,包括老友专属福利券包、无门槛优惠券、出海补贴优惠券、迁云补贴优惠券以及按量达标代金券等,帮助用户深入了解这些优惠券的金额、领取及使用规则,从而更好地利用这些优惠,提升购买体验。
1244 13
|
Java API
QLExpress功能清单
QLExpress从一开始就是从复杂的阿里电商业务系统出发,并且不断完善的脚本语言解析引擎框架,在不追求java语法的完整性的前提下(比如异常处理,foreach循环,lambda表达式,这些都是groovy是强项),定制了很多普遍存在的业务需求解决方案(比如变量解析,spring打通,函数封装,操作符定制,宏替换),同时在高性能、高并发、线程安全等方面也下足了功夫,久经考验。
22828 1
|
11月前
|
人工智能 JSON Java
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
AI时代下,规则引擎的需求反而更旺盛。QLExpress4 通过全面重构,在性能、可观测性和AI友好性上大幅提升。
2659 15
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
|
12月前
|
运维 算法 数据挖掘
【故障定位系列】基于DeepSeek的故障定位大揭秘
传统故障定位依赖专家经验与固定算法,难以应对复杂场景。引入DeepSeek大模型后,可凭借其强大推理与自适应能力,实现智能故障定位。通过“大模型+Agent”协同架构,大模型负责决策,Agent执行数据分析,既降低Token消耗,又保留智能化分析优势。未来,随着大模型理解与推理能力提升,故障定位将更高效、精准。
|
10月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过YAML配置表达式规则。支持AST语法树解析、上下文构建与动态执行,提供脚本缓存、别名映射、指令重写等扩展能力,适用于灵活的业务逻辑解耦与动态化控制。
|
存储 运维 监控
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案,替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度,规模达到 50 台服务器, 倒排索引将全文检索性能提升7倍,2PB 数据,每天新增日志量超过万亿条,峰值写入吞吐 6GB/s 。
1376 5
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
|
机器学习/深度学习 存储 监控
实时特征处理框架:构建与应用实践
在大数据时代,实时特征处理框架成为数据驱动应用的核心组件。这些框架能够从海量数据中提取特征,并实时更新,为机器学习模型提供动力。本文将探讨实时特征框架的构建和生产实践,分享如何构建一个高效、稳定的实时特征处理系统。
503 2

热门文章

最新文章