LiteFlow LiteFlow
💒首页
  • v2.15.0(当前版本)
  • What's New

    • 🌈What' s New In LiteFlow v2.15.0?
  • 历史版本

    • v2.13.X
    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 🌈2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
👑LF CLUB社区
  • 常见问题
  • 专题解释

    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩IDEA插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)

广告采用随机轮播方式显示 ❤️成为赞助商
💒首页
  • v2.15.0(当前版本)
  • What's New

    • 🌈What' s New In LiteFlow v2.15.0?
  • 历史版本

    • v2.13.X
    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 🌈2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
👑LF CLUB社区
  • 常见问题
  • 专题解释

    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩IDEA插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)
  • 🍤LiteFlow简介
  • 🍓项目特性
  • 🧁环境支持

    • ☕️JDK支持度
    • 🌿Springboot支持度
    • 🌱Spring的支持度
  • 🍟快速开始(Hello world)

    • 🍄说明
    • 🌿Springboot场景安装运行
    • 🌱Spring场景安装运行
    • 🍩Solon场景安装运行
    • 🌵其他场景安装运行
  • 🍢配置项

    • 🍄说明
    • 🌿Springboot下的配置项
    • 🌱Spring下的配置项
    • 🍩Solon下的配置项
    • 🌵其他场景代码设置配置项
  • 🔗组件

    • 🛍继承式组件

      • 📎普通组件
      • ✂️选择组件
      • ⛓布尔组件
      • 🧬次数循环组件
      • ⌛️迭代循环组件
      • 🏄LiteflowComponent
      • 🛀组件内方法覆盖和调用
    • 🎁声明式组件

      • 🥭什么叫声明式组件
      • 🧅类级别式声明
      • 🥥方法级别式声明
  • 🧩EL规则

    • 🍄说明
    • 🌴串行编排
    • 🎋并行编排
    • 🌾选择编排
    • 🌵条件编排
    • 🌳循环编排
    • 🥦异步循环模式
    • 🎃捕获异常表达式
    • 🍄与或非表达式
    • 🍁使用子流程
    • 🍂使用子变量
    • 💐复杂编排例子
    • 🍒前置和后置编排
    • 🍉组件参数语法

      • 说明
      • tag语法
      • data语法
      • bind语法
    • 🫐重试语法
    • ⏱️超时控制语法
    • 🥯链路继承
    • 🔆验证规则
    • 🌰关于注释
    • 🌻关于分号
    • 🐚组件名包装
  • 🌮上下文

    • 🍄说明
    • 🌯数据上下文的定义和使用
    • 🪶用初始化好的上下文传入
    • 🥨给上下文设置别名
    • 🥙上下文参数注入
    • 🪴用表达式获取上下文参数
  • 🛩执行器

    • 🍄说明
    • 🎡执行方法
    • 🎢流程入参
    • 🎈LiteflowResponse对象
    • 🪃直接执行EL规则
  • 🍋脚本组件

    • 🌭脚本语言介绍
    • 🍫脚本语言种类

      • ☕️Java脚本引擎
      • 🥏Groovy脚本引擎
      • 🧀Javascript脚本引擎
      • 🥞QLExpress脚本引擎
      • 🍧Python脚本引擎
      • 🍝Lua脚本引擎
      • 🥐Aviator脚本引擎
      • 🥠Kotlin脚本引擎
    • 🍣脚本与Java进行交互
    • 🍱多脚本语言混合共存
    • 🌯文件脚本的定义
    • 🍘动态刷新脚本
    • 🍦验证脚本
    • 🗑卸载脚本
  • 🗂规则配置源

    • 📕本地规则文件配置
    • 📘SQL数据库配置源
    • 📗ZK规则文件配置源
    • 📋Nacos配置源
    • 🗄Etcd配置源
    • 📜Apollo配置源
    • 📑Redis配置源

      • 配置说明
      • 轮询模式配置
      • 订阅模式配置
    • 📙自定义配置源
  • 🍼元数据管理

    • ⛰元数据操作器
    • 🍖平滑热刷新
    • 🍮启动不检查规则
    • 🥨启动不检查脚本
  • 🌌异步中的线程池

    • 💧说明
    • 🐋FlowExecutor层面的线程池
    • 🐠组件异步层面的线程池
    • 🪶虚拟线程
  • 🎲动态构造

    • 🍄说明
    • 🥜构造Node
    • 🌰构造EL
      • 依赖
      • 基本用法
      • 在表达式上设置子关键字
      • 在节点上设置子关键字
      • 格式化输出EL表达式
      • 目前支持的表达式和关键字
      • EL表达式参数校验
    • 🍞构造Chain
  • 🧮决策路由

    • 🏖概念以及介绍
    • 🍽决策路由用法
  • 😸生命周期

    • 🐮启动时生命周期
    • 🐳执行时生命周期
  • 🎨高级特性

    • 🍌本地规则文件监听
    • 🥠组件降级
    • 🍑组件别名
    • 🥝组件事件回调
    • 🐋组件回滚
    • 🥑隐式子流程
    • 🫐活跃规则保活策略
    • 🍕私有投递
    • 🍪组件切面
    • 🍡步骤信息
    • 🧊异常
    • 🧇打印信息详解
    • 🧁自定义请求Id
    • 🫕快速解析模式
    • 🌭不同格式规则加载
    • 🍿自定义组件执行器
    • 🍥简单监控
    • 🧉XML的DTD
  • ⛱测试用例以及示例

    • 🪁测试用例
    • 🪀DEMO案例
  • 🪂性能表现
  • v2.15.X文档
  • 🎲动态构造
铂赛东
2023-10-11
目录

🌰构造EL

# 依赖

从2.11.1版本开始,你可以在代码中动态组装EL表达式,包括创建、修改、输出EL表达式。

如果需要在代码中动态构建EL表达式,需要添加以下额外依赖:

<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>liteflow-el-builder</artifactId>
    <version>2.15.0</version>
</dependency>

# 基本用法

你可以通过工厂类ELBus创建任何一个EL表达式。比如对于这样一个EL表达式:

图示

可以调用如下方法组装该表达式:

// 组装EL表达式
ThenELWrapper el = ELBus.then(
        "a",
		ELBus.when("b", ELBus.then("c", "d")),
		"e");
System.out.println(el.toEL());

可以调用toEL()方法输出EL表达式:

THEN(a,WHEN(b,THEN(c,d)),e)

# 在表达式上设置子关键字

你可以在相应的地方调用子关键字,比如id,tag,bind,any等等,下面是几个例子

String el = ELBus.switchOpt("x").to(ELBus.when("a,b").id("x1"), "c").toEL();
System.out.println(el);
//输出:SWITCH(x).TO(WHEN(a,b).id("x1"),c);
String el = ELBus.then(ELBus.when("a", "b").any(true), "c").bind("k1","v1").toEL();
System.out.println(el);
//输出:THEN(WHEN(a,b).any(true),c).bind("k1", "v1");

# 在节点上设置子关键字

以上都是在表达式层面设置关键字,可能会有人疑问,如果我要在节点上设置data,tag,bind怎么办呢。

这里你需要用到ELBus.element("a")或是ELBus.node("a")。这两者的效果分别如下:

String el = ELBus.then(ELBus.element("a").tag("t1"), ELBus.element("b").bind("k1", "v1")).toEL();
System.out.println(el);
//输出:THEN(a.tag("t1"),b.bind("k1", "v1"));
String el = ELBus.then(ELBus.node("a").tag("t1"), ELBus.node("b").bind("k1", "v1")).toEL();
System.out.println(el);
//输出:THEN(node("a").tag("t1"),node("b").bind("k1", "v1"));

可以看到,其实ELBus.then("a")和ELBus.then(ELBus.element("a")是等价的,不同的是后者是可以设置子关键字的。

而ELBus.node("a")则是给节点外面套上了node关键字,其意义是在加载的时候不检查和降级,关于node关键字的详细可参考组件名包装以及组件降级。

提示

其实用java去构造EL表达式的思路和书写表达式的思路是一样的。其结构几乎是完全一样的。这个相信开发者多加以试试就能举一反三。

这里只是针对几种情况做一些介绍,不会一一介绍每个方法。

# 格式化输出EL表达式

容易能发现toEL()方法输出的EL表达式是一行字符串,不方便查看以及校验EL表达式是否正确。可以使用 toEL(true) 方法以树形结构输出EL表达式,以下是一个例子:

// EL表达式组装
WhenELWrapper el = ELBus.when("a",
		ELBus.when(ELBus.node("b").data("whenData", "{\"name\":\"zhangsan\",\"age\":18}"))
		     .when("c")
			 .id("this is a id"),
		"d").tag("this is a tag").any(true);
System.out.println(el.toEL(true));

输出得到:

whenData = '{"name":"zhangsan","age":18}';
WHEN(
	node("a"),
	WHEN(
		node("b").data(whenData),
		node("c")
	).id("this is a id"),
	node("d")
).any(true).tag("this is a tag")

# 目前支持的表达式和关键字

目前支持到2.13.0版本的所有EL表达式,包括其中的关键字和高级特性。当前支持的详细内容如下表:

EL表达式 创建方法 支持调用方法 支持关键字
串行编排 ELBus.then then(Object ... objects) pre
finally
tag
id
maxWaitSeconds
data
bind
并行编排 ELBus.when when(Object ... objects) any
ignoreError
customThreadExecutor
must
tag
id
maxWaitSeconds
data
bind
选择编排 ELBus.switch to(Object... objects)
defaultOpt(Object object)
tag
id
maxWaitSeconds
data
bind
条件编排 ELBus.ifOpt elseOpt(Object falseObject)
elIfOpt(Object ifObject, Object trueObject)
tag
id
maxWaitSeconds
data
bind
循环编排 ELBus.forOpt
ELBus.whileOpt
ELBus.iteratorOpt
doOpt(Object object)
breakOpt(Object object) (ITERATOR迭代器循环表达式不支持)
parallel
tag
id
maxWaitSeconds
捕获异常表达式 ELBus.catchException doOpt(Object object) tag
id
maxWaitSeconds
与表达式 ELBus.and and(Object ... object) tag
id
maxWaitSeconds
data
bind
或表达式 ELBus.or or(Object ... object) tag
id
maxWaitSeconds
非表达式 ELBus.not tag
id
maxWaitSeconds
data
bind
单节点表达式 ELBus.node tag
data
maxWaitSeconds
data
bind
前置组件 通过then组件的pre关键字创建 tag
id
maxWaitSeconds
data
bind
后置组件 通过then组件的finally关键字创建 tag
id
data
bind

# EL表达式参数校验

组装表达式时会对表达式的参数类型进行校验。包括是否为单节点组件、是否允许为与或非表达式等。比如,WHILE表达式WHILE(w).DO(THEN(a, b)); 中,w需要是返回布尔值的节点或与或非表达式。

更多测试样例请在 liteflow-testcase-el/liteflow-testcase-el-builder 模块中查看。

帮助我们改善此文档 (opens new window)
上次更新: 2025/08/28, 22:41:24
🥜构造Node
🍞构造Chain

← 🥜构造Node 🍞构造Chain→

Theme by Vdoing | Copyright © 2020-2025 铂赛东 | MIT License
沪ICP备18012955号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式