SpringBoot集成LiteFlow实现轻量级工作流引擎

LiteFlow 是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑。通过支持热加载规则配置,开发者能够即时调整流程步骤,将复杂的业务如价格计算、下单流程等拆分为独立且可复用的组件,从而实现系统的高度灵活性与扩展性。

一、基础概念

1.1 组件(Component)

LiteFlow 的核心概念是组件,组件是业务逻辑的最小单元。每个组件都对应一个具体的业务操作,例如“发送邮件”“计算价格”等。组件之间通过规则进行编排,形成完整的业务流程。

liteflow 的组件在规则文件中即对应的节点,组件对应的种类有很多,具体的如下所示:

  • 普通组件

普通组件需要集成的是 NodeComponent, 可以用在 when 和 then 逻辑中,具体的业务需要在 process 中去执行。同时在 node 节点中,可以覆盖 iaAccess 方法,表示是否进入该节点执行业务逻辑,isContinueOnError 判断在出错的情况下是否继续执行下一个组件,默认为 false。 isEnd 方法表示是否终止流程,默认为true。

  • 选择组件

选择组件是通过业务逻辑来判断接下来的动作要执行哪一个节点,类似于 Java中的 switch , 在代码中则需要继承 NodeSwitchComponent 实现 processWitch 方法来处理业务。

# flow 规则表达式 选择组件
SWITCH(a).to(b, c);
# processWitch 表达式需要返回的是 b 或者 c 字符串来执行相应的业务逻辑
# flow 规则表达式 条件组件
IF(x, a, b);
  • 条件组件

条件组件称之为 if 组件,返回的结果是 true 或者 false, 代码需要集成 NodeIfComponent 重写 processIf 方法,返回对应的业务节点,这个和选择组件类似。

在官方文档中,还有次数循环组件,条件循环组件,循环迭代组件,和退出循环组件,其应用场景比较复杂,可以使用简单的普通组件来替代,毕竟是轻量级的规则引擎,主要作用就是为了编排流程顺序,复杂的场景就升级使用工作流了

1.2 规则(Rule)

规则定义了组件之间的执行顺序和条件。LiteFlow 支持多种规则文件格式,如 XML、JSON、YAML 等,也支持从本地文件系统、数据库、ZooKeeper、Nacos、Apollo 等多种方式加载规则。

在我上一段实习中,就是通过Apollo配置不同场景下的多种任务编排实现实时生效

# 文件编排, then 代表串行执行  when 表示并行执行
# 串行编排示例
THEN(a, b, c, d);
# 并行编排示例
WHEN(a, b, c);
# 串行和并行嵌套结合
THEN( a, WHEN(b, c, d), e);
# 选择编排示例
SWITCH(a).to(b, c, d);
# 条件编排示例
THEN(IF(x, a),b );

1.3 上下文(Context)

上下文用于在组件之间传递数据。LiteFlow 提供了灵活的上下文机制,可以在流程执行过程中存储和共享数据。这里实际上在代码里定义一个全局变量在整个流程中进行流传即可

1.4 参数配置

liteflow 中,需要配置的内容有规则文件地址,节点重试(执行报错时可以进行重试,类似于 spring-retry), 流程并行执行线程池参数配置,流程的请求ID配置。

liteflow:# 规则文件 失败重试次数 打印执行日志 监控日志ruleSource : liteflow/*.el.xmlretry-count: 0print-execution-log: truemonitor:enable-log: trueperiod: 300000request-id-generator-class: com.platform.orderserver.config.AppRequestIdGenerator# 上下文的最大数量槽slot-size : 10240# 线程数,默认为64main-executor-works: 64# 异步线程最长等待时间 秒when-max-wait-seconds: 15# when 节点全局异步线程池最大线程数when-max-workers: 16# when 节点全局异步线程池队列数when-queue-limit: 5120# 在启动的时候就解析规则parse-on-start: trueenable: true

二、基础用法

2.1 引入依赖

在 Spring Boot 项目中,可以通过以下方式引入 LiteFlow 依赖:

<dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>2.10.6</version>
</dependency>

2.2 定义组件

通过 @LiteflowComponent 注解定义组件,并实现具体的业务逻辑

@LiteflowComponent("sendEmail")
public class SendEmailComponent extends NodeComponent {@Overridepublic void process() throws Exception {System.out.println("发送邮件");}
}

2.3 编写规则文件

flow.xml 文件中定义规则,也可以在代码中自定义实现EL规则

xml定义方式

<flow><chain name="test_flow">THEN(prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone));</chain>
</flow>

代码中定义方式

import com.yomahub.liteflow.core.NodeComponent;
import com.yomahub.liteflow.el.ELBus;
import com.yomahub.liteflow.el.ThenELWrapper;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.yomahub.liteflow.slot.DefaultContext;
import com.yomahub.liteflow.spring.SpringFlowExecutor;
import org.springframework.beans.factory.annotation.Autowired;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class LiteFlowDemo {@Autowiredprivate SpringFlowExecutor flowExecutor;public void buildAndExecuteFlow() {// 假设有一个配置列表,每个配置项对应一个处理器List<Map<String, Object>> configList = new ArrayList<>();configList.add(Map.of("name", "processor1"));configList.add(Map.of("name", "processor2"));// 假设有一个处理器名称映射表Map<String, String> processorNameMap = Map.of("processor1", "component1","processor2", "component2");// 构建 EL 表达式ThenELWrapper finalEL = ELBus.then();for (int i = 0; i < configList.size(); i++) {Map<String, Object> config = configList.get(i);String name = (String) config.get("name");if (!processorNameMap.containsKey(name)) {System.out.println("No component exists for name: " + name);continue;}String processor = processorNameMap.get(name);finalEL.then(ELBus.node(processor).data("param" + i, "data" + i));}// 执行流程LiteflowResponse response = flowExecutor.execute2Resp("mainFlow", new DefaultContext());if (response.isSuccess()) {System.out.println("Flow executed successfully");} else {System.out.println("Flow execution failed");}}
}

2.4 执行流程

通过 FlowExecutor 执行流程:

LiteflowResponse response = flowExecutor.execute2Resp("test_flow", new DataRequest());

三、适用场景

LiteFlow 适用于拥有复杂逻辑的业务场景,例如:

  • 电商下单流程:包括订单创建、库存扣减、支付处理、通知发送等多个步骤。
  • 价格计算引擎:根据不同的规则和条件计算商品价格。
  • 数据处理流程:在数据处理中,需要按顺序执行多个步骤。

四、与 Java 设计模式的相似性

4.1 策略模式

LiteFlow 的组件类似于策略模式中的策略类,可以根据不同的规则动态选择执行的组件。

4.2 模板方法模式

LiteFlow 的流程定义类似于模板方法模式中的模板方法,定义了业务流程的骨架,而具体的组件实现则类似于模板方法中的具体步骤。

4.3 责任链模式

LiteFlow 的组件可以通过规则进行串联,类似于责任链模式中的责任链,每个组件负责处理一部分逻辑。

五、实战使用

5.1 电商订单处理案例

假设在一个电商系统中,订单完成后需要进行积分发放、消息发送,并行发送短信和邮件。可以通过以下方式实现:

xml

<flow><chain name="orderCompleteFlow">THEN(prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone));</chain>
</flow>

5.2 动态规则更新

LiteFlow 支持热加载规则文件,可以在不重启应用的情况下更新规则。例如,将规则文件存储在数据库或配置中心(如 Nacos),修改规则后可以实时生效。

5.3 监控与日志

LiteFlow 提供了详细的执行日志和监控功能,可以记录每个组件的执行时间、执行结果等信息,方便排查问题。

5.4 高级特性

  • 组件降级:在某些组件执行失败时,可以选择降级处理。
  • 组件继承:可以通过继承的方式复用组件逻辑。
  • 组件回滚:在流程执行失败时,可以选择回滚到之前的步骤。

六、总结

LiteFlow 是一个功能强大且灵活的规则引擎框架,适用于复杂的业务流程编排。通过组件化的方式,可以将复杂的业务逻辑拆分为独立的组件,通过规则进行编排,实现系统的高度灵活性和扩展性。同时,LiteFlow 提供了丰富的功能,如热加载、监控、日志等,方便开发者使用。

扩展问题自测

1. LiteFlow 的核心概念是什么?它是如何实现规则编排的?

LiteFlow 是将复杂逻辑抽解为一个个可复用的组件化,通过组件间的自由搭配实现灵活编排。以及利用Apollo或Nacos这些注册中心进行实时热更新

组件间的自由搭配是通过规则链实现的

{"chainId": "recommendChain","name": "推荐链路","condition": "A > B > C "
}

总结:通过 组件化 + 规则链 实现编排,通过注册中心监听配置变更实现热更新

2. LiteFlow 规则节点(Component)的执行机制是怎样的?支持哪些执行模式?

  1. 执行机制
  • 初始化组件,通过@LiteflowComponent 组件进行组件注册
  • 解析规则链:解析规则链中组件执行链路
  • 执行规则链
  1. 执行模式
  • 顺序模式:"condition": "A > B > C" ABC顺序执行
  • 并行执行:"condition": "A && B && C" 我们的业务中,对商品的多路召回就是并行的
  • 选择执行 "condition": "A | B | C" 只执行多个流程中最先完成的组件
  • 条件执行 "condition": "A WHEN(B > C)"A 先执行,然后判断是否执行 B > C 这条链路。

适用于 根据外部参数动态决定执行路径

  • FOR 循环 "condition": "FOR(A, 3)" 适用于 重复性任务,如轮询、批量处理等
  • WHILE 循环 "condition": "WHILE(A, isContinue())" 适用于 动态决策的业务场景,如轮询、流式处理
  • 失败处理 "condition": "A THEN(B) A 失败后,会执行 B 作为补偿措施。适用于 容错、降级、回滚等场景

3. LiteFlow 的规则是如何定义和加载的?

三种方式进行规则定义与加载

  • json格式,在配置文件进行配置
  • xml格式,同上
  • java代码中动态注册规则链(推荐系统目前使用方式)

4. LiteFlow 规则流转时,如何保证数据在多个节点之间的传递?

LiteFlow实际上也是参考了责任链模式,通过一个全局变量作为上下文进行数据流转。LiteFlow里这个上下文变量叫做Slot(上下文容器)

LiteFlow 的 Slot 是一个 线程隔离的上下文容器,用于存储和管理整个流程中的数据,类似于 ThreadLocal,但更适用于 流程级别的数据共享

每次执行规则链时,LiteFlow 都会为当前执行实例创建一个 独立的 Slot,不同的请求不会相互影响。

LiteFlow 通过 ThreadLocal + 对象池 机制来管理 Slot,确保:

  • 每个请求拥有独立的 Slot 实例,数据不会互相污染。
  • Slot 复用机制 提高性能,避免频繁创建对象。

总结

LiteFlow 通过 Slot(数据槽)在多个节点之间传递数据,相当于流程级别的全局上下文。

Slot 的作用类似责任链模式中的 Context,存储数据供整个规则链使用。

每个请求拥有独立的 Slot,避免线程安全问题,同时通过对象池优化性能。

5. LiteFlow 支持哪些异步执行模式?如何处理异步任务之间的依赖?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

38 python random

在实际中,我们常常会用到随机的概念,比如 模拟抽奖活动(如:月度优秀员工抽奖)生成测试数据(如:随机考勤时间、随机销售额)打乱数据顺序(如:随机分配任务到人)Python 的random模块就像你的 "随机事件生成器",帮你轻松创建各种随机数据 一、基础操作:从随…

附赠二张图,阐述我对大模型的生态发展、技术架构认识。

文章精炼&#xff0c;用两张图说明大模型发展业态方向&#xff0c;以及大模型主体技术架构。&#xff08;目前还需要进一步验证我的Thought && ideas&#xff0c;等待机会吧.........&#xff09; 图一&#xff1a;探究大模型三个层次应用方向&#xff0c;浅层次入门简…

2025上海车展 | 移远通信全栈车载智能解决方案重磅亮相,重构“全域智能”出行新范式

2025年4月23日至5月2日&#xff0c;第二十一届上海国际汽车工业展览会在国家会展中心&#xff08;上海&#xff09;盛大启幕。作为车载智能解决方案领域的领军企业&#xff0c;移远通信以“全域智能 驭见未来”为主题&#xff0c;携丰富的车载解决方案及客户终端惊艳亮相8.2馆8…

告别 “幻觉” 回答:RAG 中知识库与生成模型的 7 种对齐策略

一、引言 大语言模型&#xff08;LLM&#xff09;在文本生成领域展现出惊人能力&#xff0c;但 “幻觉” 问题&#xff08;生成虚构或偏离事实的内容&#xff09;始终是落地应用的核心挑战。检索增强生成&#xff08;RAG&#xff09;通过将外部知识库与 LLM 结合&#xff0c;形…

项目笔记2:post请求是什么,还有什么请求

在 HTTP&#xff08;超文本传输协议&#xff09;中&#xff0c;请求方法用于向服务器表明客户端想要执行的操作。POST 请求是其中一种常见的请求方法&#xff0c;此外还有 GET、PUT、DELETE 等多种请求方法&#xff0c;下面为你详细介绍&#xff1a; POST 请求 定义&#xff…

中间系统-邻居建立,数据库同步

ISIS邻居状态&#xff1a; 1、Down&#xff1a;接口一旦启用ISIS协议之后就是Down状态 2、Init&#xff1a;收到了邻居的Hello报文后&#xff0c;发现了邻居。 3、up&#xff1a;收到了邻居的Hello报文&#xff0c;并且在邻居的hello报文中发现了自己。 ISIS邻居建立的条件&…

玩转Docker | Docker部署LMS轻量级音乐工具

玩转Docker | Docker部署LMS轻量级音乐工具 前言一、LMS介绍LMS简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署LMS服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问LMS服务访问LMS首页注册账号五、基本使用上传音乐文…

AR行业应用案例与NXP架构的结合

1. 工业巡检AR头盔 场景示例&#xff1a;宁德核电基地使用AR智能头盔进行设备巡检&#xff0c;通过实时数据叠加和远程指导&#xff0c;将工作效率提升35%。头盔需处理传感器数据、图像渲染和低延迟通信1。 NXP架构支持&#xff1a; 协处理器角色&#xff1a;NXP i.MX RT系列M…

【Harmony OS】组件

目录 组件概述 组件常用属性 系统内置组件 Text TextArea 多行文本输入框组件 TextInput 文本输入框 Button Image 图片组件&#xff0c;支持本地图片和网络图片 Radio 单选框 Checkbox 复选框 Blank 空白填充组件 Divider 分隔符 PatternLock 图案密码锁组件 Prog…

Flutter Dart 集合类型List Set Map详解军 以及循环语句 forEaclh map where any every

List基础用法 var list1 ["西瓜", "苹果", "香蕉", true, 0];var list2 <String>["西瓜", "苹果", "香蕉"];List list3 ["西瓜", "苹果", "香蕉"];list3.add("草莓&…

在网上找的资料怎样打印出来?

在数字化时代&#xff0c;我们经常需要从互联网上获取各种资料&#xff0c;无论是学术论文、工作文档还是学习资料。然而&#xff0c;如何高效地将这些网上的资料打印出来&#xff0c;却是一个值得探讨的问题。本文将为您提供一个全面的解决方案&#xff0c;帮助您轻松完成网上…

2025年计算机视觉与智能通信国际会议(ICCVIC 2025)

2025 International Conference on Computer Vision and Intelligent Communication 一、大会信息 会议简称&#xff1a;ICCVIC 2025 大会地点&#xff1a;中国杭州 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 二、会议简介 2025年计算机视觉与智能通…

程序员思维体操:TDD修炼手册

程序员思维体操&#xff1a;TDD修炼手册 ——从"先写代码"到"测试先行"的认知革命 一、重新认识TDD&#xff1a;不仅仅是写测试 什么是TDD&#xff08;测试驱动开发&#xff09; TDD其实很简单&#xff0c;不要看名字很高级复杂&#xff0c;传统开发是直…

建筑节能成发展焦点,楼宇自控应用范围持续扩大

在全球能源危机日益严峻、环保意识不断增强的大环境下&#xff0c;建筑节能已成为建筑行业发展的核心议题。从大型商业综合体到普通住宅&#xff0c;从公共建筑到工业厂房&#xff0c;节能需求贯穿建筑全生命周期。而楼宇自控系统凭借其对建筑设备的智能化管理和精准调控能力&a…

嵌入式软件--stm32 DAY 3

0、GPIO回顾 GPIO&#xff0c;通用型输入输出&#xff0c;控制stm32输入输出的引脚&#xff0c;统称GPIO。 主功能是默认的功能 复用的功能在芯片里都是由连线的&#xff0c;有联系才能复用。所以GPIO引脚能复用的功能只能是它默认复用功能和重定义功能。一般都使用默认功能…

点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法

目录 知识储备 结合二次误差度量与高斯混合模型的点云配准 算法核心创新点: 关键参数说明: 性能优化建议: 前言 国内外研究现状 全局配准算法的国内外研究 局部配准算法的国内外研究 2 点云配准相关概念与方法 2.1 什么是点云配准 2.2 点云的获取及点云主要数据…

linux系统问题杂谈

1.配置好anaconda之后&#xff0c;在一个终端中编辑好环境变量之后能够正常使用conda命令&#xff0c;但是新打开一个中断使用conda命令报错"无法识别conda"。 原因&#xff1a;使用“export PATH"/home/username/anaconda3/bin:$PATH"命令&#xff0c;临…

【中级软件设计师】函数调用 —— 传值调用和传地址调用 (附软考真题)

【中级软件设计师】函数调用 —— 传值调用和传地址调用 (附软考真题) 目录 【中级软件设计师】函数调用 —— 传值调用和传地址调用 (附软考真题)一、历年真题二、考点&#xff1a;函数调用 —— 传值调用和传地址调用&#x1f53a;1、传值调用&#x1f53a;2、传引用(地址)调…

Spring Cloud Gateway 如何将请求分发到各个服务

前言 在微服务架构中&#xff0c;API 网关&#xff08;API Gateway&#xff09;扮演着非常重要的角色。它负责接收客户端请求&#xff0c;并根据预定义的规则将请求路由到对应的后端服务。Spring Cloud Gateway 是 Spring 官方推出的一款高性能网关&#xff0c;支持动态路由、…

打造高功率、高电流和高可靠性电路板的厚铜PCB生产

厚铜PCB生产是指制作一种具有较厚铜层的PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;。这种PCB通常用于高功率、高电流和高可靠性的电子设备中。厚铜PCB的生产过程包括以下几个 主要步骤&#xff1a; 1. 基材准备 厚铜PCB的基材通常采用FR4或CEM-…