LiteFlow轻量级工作流引擎使用示例详解
在复杂的业务系统中,流程编排和逻辑解耦是提升可维护性的关键挑战。LiteFlow作为一款国产轻量级工作流引擎,以其声明式编排、组件化设计和极简API成为优雅解决这些问题的利器。下面通过详细示例展示其核心用法。
一、LiteFlow 核心概念速览
- 组件 (Component):业务逻辑的最小执行单元,继承
NodeComponent
。 - 流程 (Chain):由组件节点组成的执行链路,通过 EL 表达式(如
THEN(a, b, c)
)定义。 - 上下文 (Context):流程中传递数据的载体,自定义数据容器。
- 规则文件:XML 或 JSON 格式的流程定义文件(默认位置:
resources/rule
)。
二、SpringBoot 整合 LiteFlow
依赖引入:
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.11.1</version>
</dependency>
配置 application.yml:
liteflow:
rule-source: config/flow-rule.xml # 规则文件路径
enable-log: true # 启用执行日志
三、实战示例:订单处理工作流
场景描述
订单创建 → 库存校验 → 支付处理 → 订单状态更新 → 通知用户
1. 定义上下文(数据载体)
public class OrderContext extends Context {
private Order order; // 订单实体
private boolean stockOk; // 库存状态
private String paymentResult; // 支付结果
// 省略 getter/setter
}
2. 实现业务组件
@Component("stockCheck")
public class StockCheckCmp extends NodeComponent {
@Override
public void process() {
OrderContext ctx = getContextBean(OrderContext.class);
boolean available = stockService.check(ctx.getOrder().getSkuId());
ctx.setStockOk(available);
if (!available) throw new RuntimeException("库存不足!");
}
}
@Component("payment")
public class PaymentCmp extends NodeComponent {
@Override
public void process() {
OrderContext ctx = getContextBean(OrderContext.class);
ctx.setPaymentResult(paymentService.pay(ctx.getOrder()));
}
}
// 其他组件:OrderCreateCmp, StatusUpdateCmp, NotifyUserCmp
3. 编写流程规则 (flow-rule.xml
)
<chain name="orderProcessChain">
<!-- 顺序执行 + 条件分支 -->
THEN(
orderCreate,
stockCheck,
SWITCH(payment).TO(
WHEN(creditCardPay, aliPay), // 并行支付方式
wechatPay
),
statusUpdate,
notifyUser
);
</chain>
4. 触发流程执行
@RestController
public class OrderController {
@Resource private FlowExecutor flowExecutor;
@PostMapping("/createOrder")
public String createOrder(@RequestBody Order order) {
OrderContext ctx = new OrderContext();
ctx.setOrder(order);
LiteflowResponse response = flowExecutor.execute2Resp(
"orderProcessChain", // 规则链名称
null, // 流程初始参数(可空)
ctx // 业务上下文
);
return response.isSuccess() ? "订单创建成功" : "失败:" + response.getMessage();
}
}
四、进阶用法示例
1. 条件分支与跳转
<chain name="complexChain">
IF(x, THEN(a, b).ELSE(c)), // 条件判断
SWITCH(y).TO(d, e, f), // 选择分支
FOR(f).DO(THEN(g, h)) // 循环执行
</chain>
2. 异步节点执行
@Component("asyncTask")
public class AsyncTaskCmp extends NodeComponent {
@Override
public void process() {
// 标记当前节点异步执行
this.setIsAsync(true);
asyncService.execute(() -> {
// 耗时操作
sendReportEmail();
});
}
}
3. 组件复用与嵌套
<chain name="parentChain">
THEN(prepare, SUB(child_chain), postProcess)
</chain>
<chain name="child_chain">
THEN(task1, task2)
</chain>
五、LiteFlow 核心优势
- 轻量嵌入:仅需 2 个依赖,无中间件强依赖
- 热更新:修改规则文件实时生效,无需重启
- 可视化跟踪:内置
liteflow-slot
日志输出执行路径 - 灵活扩展:支持自定义节点、拦截器、上下文插件
- 优雅降级:提供
fallback
方法处理组件异常
六、性能优化建议
- 避免上下文臃肿:仅传递必要数据
- 异步化慢操作:对 I/O 密集型组件启用
isAsync
- 复用子链:抽象通用流程片段
- 缓存规则解析:配置
liteflow.parse-on-start=true
七、适用场景对比
场景 | LiteFlow 优势 | 替代方案 |
---|---|---|
动态业务流程 | 规则热更新,灵活调整路径 | 硬编码 if/else |
多版本流程并存 | 通过不同 Chain 隔离 | 策略模式+工厂 |
可视化流程跟踪 | 内置执行路径输出 | 手动日志拼接 |
组件化业务复用 | 跨流程共享节点 | 工具类抽取 |
统计显示:在中等复杂度流程中,LiteFlow 比硬编码逻辑减少 60% 的代码修改量,提升流程调整效率 3 倍以上。
八、总结
LiteFlow 通过 “组件 + 规则文件” 的解耦设计,完美平衡了灵活性与可维护性。其特点在于:
- 学习曲线平缓:EL 表达式接近自然语言
- 侵入性极低:业务组件无需感知流程逻辑
- 扩展性强:支持自定义脚本节点(Groovy/JS)
- 生态完善:提供 IDEA 插件、监控台等工具
项目地址:https://github.com/dromara/liteflow
最佳实践:适用于订单、风控、审批、数据管道等需要灵活编排的场景。
在微服务架构下,LiteFlow 可作为单服务内部的流程调度引擎,与 Camunda 等重型 BPMN 引擎形成互补,在轻量化场景中展现出显著优势。通过本文示例,开发者可快速掌握其核心用法,为业务系统注入灵活高效的流程控制能力。