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

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

    • 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是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)

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

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

    • 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是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)
  • 🍤LiteFlow简介
  • 🍓项目特性
  • 🧁环境支持

  • 🍟快速开始(Hello world)

  • 🍢配置项

  • 🗂规则以及配置源

  • 🔗常规组件

  • 🧩EL规则的写法

  • 🌮数据上下文

  • 🛩执行器

  • 🍋脚本组件

  • 🍇声明式组件

  • 🎲用代码动态构造规则

    • 🍄说明
    • 🥜构造Node
    • 🌰构造EL
      • 依赖
      • 构建一个EL表达式
      • 格式化输出EL表达式
      • 目前支持的表达式和关键字
      • EL表达式参数校验
      • 不包装的Node
    • 🍞构造Chain
  • 🍼元数据管理

  • 🧮决策路由

  • 😸生命周期

  • 🎨高级特性

  • ⛱测试用例以及示例

  • 🪂性能表现
  • v2.12.X文档
  • 🎲用代码动态构造规则
铂赛东
2023-10-11
目录

🌰构造EL

# 依赖

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

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

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

# 构建一个EL表达式

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

图示

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

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

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

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

提示

为了避免可能的冲突,node("")将组件名进行了包装,以确保Node的名称与LiteFlow组件名规范不发生冲突。更详细的内容请查看组件名包装。

除了构建表达式之外,你也可以在表达式中调用表达式的关键字,比如为选择组件的子组件设置id、tag,设置并行组件的any关键字等等。如下例所示:

<!-- 目标EL表达式 -->
<chain name="chain1">
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")
</chain>

可以通过以下方法组装出该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);

该EL表达式输出如下:

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")

# 格式化输出EL表达式

容易能发现toEL()方法输出的EL表达式是一行字符串,不方便查看以及校验EL表达式是否正确。可以使用 toEL(true) 方法以树形结构输出EL表达式。对于上一个例子中的EL表达式,调用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.11.1版本的所有EL表达式,包括其中的关键字和高级特性。当前支持的详细内容如下表:

EL表达式 创建方法 支持调用方法 支持关键字
串行编排 ELBus.then then(Object ... objects) pre
finally
tag
id
maxWaitSeconds
并行编排 ELBus.when when(Object ... objects) any
ignoreError
customThreadExecutor
must
tag
id
maxWaitSeconds
选择编排 ELBus.switch to(Object... objects)
defaultOpt(Object object)
tag
id
maxWaitSeconds
条件编排 ELBus.ifOpt elseOpt(Object falseObject)
elIfOpt(Object ifObject, Object trueObject)
tag
id
maxWaitSeconds
循环编排 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
或表达式 ELBus.or or(Object ... object) tag
id
maxWaitSeconds
非表达式 ELBus.not tag
id
maxWaitSeconds
单节点表达式 ELBus.node tag
data
maxWaitSeconds
前置组件 通过then组件的pre关键字创建 tag
id
maxWaitSeconds
后置组件 通过then组件的finally关键字创建 tag
id

# EL表达式参数校验

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

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

# 不包装的Nodev2.12.3+

如果用ELBus.node("a")这种,最后toEL()出来的是node("a"),这是经过包装过的组件,这种包装过的组件在启动时不会检查a存不存在,而在执行时当a不存在时,会调用a的降级组件。

关于降级组件请参照组件降级这一章。

如果不希望出来的是包装过的,可以用ELBus.commonNode("a"),那最后toEL()出来就是a。这种同样适用于放一个chainId。

帮助我们改善此文档 (opens new window)
上次更新: 2025/02/16, 21:26:30
🥜构造Node
🍞构造Chain

← 🥜构造Node 🍞构造Chain→

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