
做过复杂业务的 Java 开发者大概都经历过这样的噩梦一个订单处理方法从最初的 50 行经过三轮需求迭代膨胀到 500 行。里面嵌套着六层 if-else夹杂着硬编码的分支逻辑改一处怕崩一片。新人来了看不懂老人走了不敢改。更糟糕的是产品经理隔三差五就跑过来说这个审批流程要加一个总监审批环节、满减规则从三档改成五档、大客户走特殊通道……每一次变更都是一次代码外科手术。流程编排就是为解决这个问题而生的。把散落在代码各处的业务逻辑抽象为一个个独立的节点然后用声明式的方式定义它们的执行顺序和分支条件。这样既解耦了代码又让业务规则一目了然更重要的是——规则的变更不再需要修改 Java 代码、走完整的发版流程。今天要介绍的是——Solon Flow。它不仅覆盖了 “规则编排” 和 “任务流水线”还原生支持 “AI Agent 编排”而且不绑定任何特定框架Spring Boot 项目一样能用。一、Solon Flow 是什么Solon Flow 是基于 Solon 框架 构建的通用流程编排引擎采用偏平式编排设计所有节点平铺在同一个层级通过 link连接线描述节点之间的流转关系。它不依赖树形嵌套、不依赖 EL 表达式而是用最直觉的图结构来表达业务流程。设计理念1. 偏平式编排Solon Flow 把所有节点平铺用 link 的when条件控制流向。这种风格更接近流程图的直觉表达也更容易被非开发角色理解。# 偏平式编排节点平铺link 描述连接关系 id: order_flow layout: - id: start type: start link: check_order - id: check_order type: activity task: checkOrderTask link: - nextId: vip_route when: amount 1000 - nextId: normal_route - id: ...2. 元数据无限扩展每个节点都可以附加任意meta属性。这意味着你可以在不修改引擎代码的前提下为节点注入角色信息、表单定义、超时策略、重试次数等业务元数据实现高度的定制化。比如审批流中你可以在 meta 里定义每个审批节点对应的角色role: tl和表单form: approval_form运行时由驱动器读取并执行对应的权限检查。这种设计让 YAML 文件不仅是执行编排的定义同时也是一份业务级的配置文档。3. 驱动可定制Solon Flow 引入了类似 JDBC 驱动的机制——引擎本身只定义执行骨架具体的任务调度、条件评估等行为通过driver驱动器接口注入。这意味着同一套编排定义换一个驱动器就能变成不同的执行范式。默认驱动器使用 Solon 的 IoC 容器来解析TaskComponent但你完全可以提供一个纯 Spring 驱动器让它通过 Spring 的ApplicationContext来获取 Bean。这种可插拔的驱动设计是 Solon Flow 实现框架无关的关键技术基础。4. 可中断可恢复这是 Solon Flow 最独特的能力之一。通过context.stop()中断流程用context.toJson()将执行快照序列化持久化之后通过FlowContext.fromJson()恢复上下文引擎会自动从中断节点继续执行。注意——不是从起点重新执行而是精确地从上次中断的节点继续。这个能力对审批流、长流程、AI Agent 的持久化至关重要。你可以把快照存到数据库、Redis、甚至消息队列中根据业务需要灵活选择持久化策略。二、七种节点类型全解析Solon Flow 定义了 7 种节点类型覆盖了流程编排中最常见的执行模式。节点类型标识说明典型场景开始节点start图的唯一入口无任务执行流程起点活动节点activity执行具体业务逻辑的默认节点计算任务、服务调用包容网关inclusive多选分支满足条件的都执行汇聚时等待所有已激活分支多条件触发排它网关exclusive单选分支按优先级选择唯一一条路径条件路由并行网关parallel全选分支所有连接都执行汇聚时等待全部完成并行计算循环网关loop遍历集合或区间每个元素执行一次子流程批量处理结束节点end图的终点流程结束下面逐个看 YAML 配置示例。start — 开始节点- id: s1 type: start title: 流程开始 link: n1start 节点是图的唯一入口不执行任务只负责触发后续节点。每个图有且只有一个 start 节点。从 v3.8.4 开始start 节点支持自由流出连接与 activity 类似可以连接多个下游节点。activity — 活动节点默认- id: n1 type: activity title: 数据校验 task: validateTask meta: role: admin link: n2activity 是最常用的节点类型执行具体的业务逻辑通过task绑定TaskComponent还可以通过meta携带任意扩展数据。exclusive — 排它网关单选- id: g1 type: exclusive title: 金额分级 link: - nextId: n2 title: 3天以下 - nextId: n3 title: 3天以上 when: day 3排它网关按连接声明的优先级依次评估when条件选择第一个满足条件的路径执行。没有when条件的连接视为默认路由兜底。inclusive — 包容网关多选- id: g1 type: inclusive title: 权益发放 link: - nextId: coupon_task when: orderAmount 100 - nextId: point_task when: orderAmount 50 - nextId: gift_task when: orderAmount 500包容网关会评估所有流出连接的条件所有满足条件的分支都会执行汇聚时等待所有已激活的分支完成。类似于多选多。parallel — 并行网关全选- id: p1 type: parallel #流出 title: 并行查询 link: - nextId: query_user - nextId: query_order - nextId: query_inventory # ... 三个任务各自完成后汇聚到 p2 - id: p2 type: parallel #流入网关汇聚 title: 汇聚结果 link: merge_result并行网关的流出连接全部执行多线程并行或单线程执行汇聚端等待所有流入连接到齐后才继续。适合同时调用多个独立服务的场景。loop — 循环网关遍历- id: loop1 type: loop #流出 title: 遍历订单项 meta: $for: order # 指定要遍历接收变量名 $in: orderList # 指定要遍历的集合变量名