掌握 QLExpress:阿里巴巴开源的业务规则动态解析神器

目录

一、QLExpress快速了解

二、QLExpress与常用规则引擎对比

三、快速引用和一般工作原理简诉

(一)引用与基本演示

(二)一般工作原理说明

四、基本语法学习

(一)操作符

(二)Java对象操作

(三) 脚本中定义function

(四)扩展操作符

(五)绑定Java类或对象的methon

(六)宏定义(macro)

(七)编译脚本查询外部需要定义的变量和函数

(八)不定参数的使用

(九)集合的快捷用法

(十)集合的遍历

四、总结


干货分享,感谢您的阅读!

在现代业务系统中,如何实现快速、灵活的规则配置和动态决策,成为了企业提升响应速度和智能化水平的关键。阿里巴巴开源的 QLExpress 引擎,以其轻量、高效、简洁的优势,为复杂业务逻辑的动态处理提供了一种创新的解决方案。无论是需要实时调整规则的电商促销,还是依赖规则动态性的金融风控,QLExpress 都能以其灵活的表达式和易用的规则配置,实现高效而精准的业务决策。如果你正在寻找一款强大、灵活的动态脚本引擎,那么 QLExpress 可能正是你需要的工具!官网学习地址:https://github.com/alibaba/QLExpress

一、QLExpress快速了解

QLExpress(Quick Language Express)是阿里巴巴开源的一门动态脚本引擎解析工具,起源于阿里巴巴的电商业务,旨在解决业务规则、表达式、数学计算等动态脚本的解析问题。其具有以下基本特点:

  1. 线程安全:QLExpress被设计为线程安全的动态脚本引擎,它使用threadlocal类型的临时变量,确保在引擎运算过程中的并发场景下的线程安全性。

  2. 高效执行:为了提高执行效率,QLExpress在编译过程中可以将比较耗时的脚本编译结果缓存到本地机器。此外,运行时的临时变量创建采用了缓冲池技术,以确保高效的运行时性能,使其与一些性能优秀的脚本引擎(如Groovy)相当。

  3. 弱类型脚本语言:QLExpress采用弱类型脚本语言,语法类似于Groovy和JavaScript。这使得业务规则的表达更加灵活,虽然相对于强类型脚本语言可能略慢,但在业务的灵活性方面提供了很大的优势。

  4. 安全控制:QLExpress提供了一些运行时参数的设置,以进行安全控制。通过这些参数,可以预防一些潜在的安全问题,如死循环或对高危系统API的调用。

  5. 代码精简、依赖最小:QLExpress的设计追求代码的精简和最小依赖,其jar包大小为250k,适用于所有Java的运行环境。这使得它在各种环境中都能轻松部署和运行,包括在Android系统的低端POS机上广泛应用。

总体而言,这些特性使QLExpress成为一个在阿里电商业务场景中得到广泛应用的强大工具,具有高效、灵活和安全的特点。

二、QLExpress与常用规则引擎对比

特性 / 规则引擎 Drools Aviator EasyRule QLExpress
语言 Drools规则语言 (DRL) Aviator表达式语言 Java 弱类型脚本语言
性能 适用于复杂规则,可能较慢 高性能表达式求值引擎 相对较高性能,适用于简单规则 高效执行,适用于业务规则和表达式计算
灵活性 非常灵活,支持动态修改规则 灵活,支持丰富的运算符和函数 简单易用,适合非专业开发人员 灵活,支持业务规则、表达式和数学计算
语法 专门的规则语言 表达式语言 Java编写规则 弱类型脚本语言,类似于Groovy和JavaScript
应用场景 复杂的业务规则 简单的表达式计算和规则 简单规则场景,面向非专业开发人员 业务规则、表达式、数学计算,适用于电商业务
开发者社区 大型开发者社区 相对较小的社区规模 相对较小的社区规模 相对较小的社区规模,阿里巴巴内部有影响力
文档 详尽的文档 文档相对较少 文档相对较少 文档相对较少,可能需要深入源代码理解
开源

Drools适用于复杂的业务规则,而Aviator和QLExpress适用于相对简单的表达式计算和规则。EasyRule更适合简单规则场景,特别是面向非专业开发人员的情况。最终选择取决于具体需求,包括业务规则的复杂性、性能要求、开发人员技能水平以及项目的特定场景。

三、快速引用和一般工作原理简诉

(一)引用与基本演示

在 Maven 项目中引入 QLExpress,需要在项目的 pom.xml 文件中添加相关的依赖:

<dependencies>
    <dependency>
        <groupId>com.ql</groupId>
        <artifactId>qlExpress</artifactId>
        <version>3.2.2</version> <!-- 使用实际版本号 -->
    </dependency>
</dependencies>

以下展示简单演示如何使用 QLExpress 计算折扣后的金额。在实际项目中,可能需要更复杂的脚本和上下文,以适应业务需求。

package org.zyf.javabasic.qlexpress;

import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;

/**
 * @program: zyfboot-javabasic
 * @description: 演示如何使用 QLExpress 计算折扣后的金额
 * @author: zhangyanfeng
 * @create: 2023-11-12 21:40
 **/
public class QLExpressExample {
    public static void main(String[] args) {
        try {
            // 创建 QLExpress 引擎
            ExpressRunner runner = new ExpressRunner();

            // 创建上下文并设置变量
            DefaultContext<String, Object> context = new DefaultContext<>();
            context.put("amount", 1000);
            context.put("discount", 0.1);

            // 执行脚本
            String expression = "amount * (1 - discount)";
            Object result = runner.execute(expression, context, null, true, false);

            // 输出结果
            System.out.println("Result: " + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(二)一般工作原理说明

QLExpress的一般工作原理,包括语法树分析、上下文和执行过程。

  1. 语法树分析: QLExpress会先将输入的脚本进行词法分析和语法分析,生成一棵语法树。这个语法树表示了脚本的结构,将其组织成可以被执行的形式。

  2. 上下文: 在QLExpress中,上下文是一个关键概念。它是脚本执行时的环境,包含变量、函数等信息。在执行脚本之前,你可以向上下文中添加变量,定义函数,设置一些执行参数等。这样,脚本执行时可以引用上下文中的内容。

  3. 执行过程: QLExpress的执行过程包括编译和运行两个主要阶段。在编译阶段,脚本被解析并生成可以执行的指令序列。在运行阶段,这些指令被执行,从而实现脚本的功能。

在这个框架下,二次定制的功能扩展可以包括:

  • 自定义操作符和函数: 可以通过实现自定义的操作符和函数,使得脚本能够执行特定的业务逻辑。

  • 修改执行流程: 可以在执行阶段插入自定义的逻辑,改变脚本执行的流程。

  • 定制编译过程: 在编译阶段定制特定的优化或变换,以满足特殊需求。

  • 扩展上下文功能: 可以添加一些上下文的拦截器,使得在脚本执行前后可以执行额外的逻辑。

这样的扩展点允许更好地适应特定的业务场景和需求。

四、基本语法学习

(一)操作符

QLExpress 支持一系列操作符,包括算术运算符、比较运算符、逻辑运算符等。

类别 操作符 示例 描述
算术运算符 + a + b 加法,将两个数字相加
- a - b 减法,从第一个数字中减去第二个数字
* a * b 乘法,将两个数字相乘
/ a / b 除法,将第一个数字除以第二个数字
% a % b 取余,返回第一个数字除以第二个数字的余数
比较运算符 == a == b 等于,判断两个值是否相等
!= a != b 不等于,判断两个值是否不相等
> a > b 大于,判断第一个值是否大于第二个值
< a < b 小于,判断第一个值是否小于第二个值
>= a >= b 大于等于,判断第一个值是否大于或等于第二个值
<= a <= b 小于等于,判断第一个值是否小于或等于第二个值
逻辑运算符 && condition1 && condition2 逻辑与,两个条件都为真时结果为真
|| condition1 || condition2 逻辑或,两个条件中有一个为真时结果为真
! !con
评论 1376
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张彦峰ZYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值