Solon Flow 在供给 json/ xml 编排之后。还供给了一套极为丝滑的流程图 Fluent API。它让流程定义回归到法度榜样员最熟悉的对象——代码。

经由过程 Fluent API,你可以像写 Java Stream 一样,经由过程链式调用快速勾画出营业流转图。

1、情况预备

起首,确保你的 Java 项目中已经引入了 solon-flow 依附:

<dependency>    <groupId>org.noear</groupId>    <artifactId>solon-flow</artifactId></dependency>

2、核心概念:Graph 与 GraphSpec

在着手写代码前,须要懂得两个关键概念:

  • Graph (图):流程的最终实体,包含所有节点和连线的运行逻辑。
  • GraphSpec (图规格/定义):它是构建图的“蓝图”。在 v3.8 之后,它是 Fluent API 操作的核心对象。

3、 实战:手动编排一个“订单处理流”

假设我们有一个简单的订单流程:开端 -> 检查库存 -> 付出 -> 停止。

  • 第一步:预备营业处理组件()

Solon-flow 的设计理念是 “逻辑与实现分别”。 我们先定义具体的营业动作:

import org.noear.solon.annotation.Component;import org.noear.solon.flow.FlowContext;import org.noear.solon.flow.Node;import org.noear.solon.flow.TaskComponent;// 容器 Bean 的情势(此处以 Solon 为例)@Component("checkStock")public class CheckStockProcessor implements TaskComponent {    @Override    public void run(FlowContext ctx, Node node) throws Throwable {        System.out.println("--- 正在检查库存... ---");        ctx.put("stock_ok", true); // 在高低文中存入成果    }}//-------------// 通俗 Java 类import org.noear.solon.annotation.Component;import org.noear.solon.flow.FlowContext;import org.noear.solon.flow.Node;import org.noear.solon.flow.TaskComponent;public class PayProcessor implements TaskComponent {    @Override    public void run(FlowContext context, Node node) throws Throwable {        System.out.println("--- 付出成功! ---");    }}
  • 第二步:应用 Fluent API 编排流程

下面是本文的核心代码。我们经由过程 Graph.create 启动编排:

经由过程本文,你已经学会了若何不依附任何设备文件,纯手工在内存中“画”出一个流程图。这种方法极大年夜地进步了代码的可读性,并且让“流程定义”本身也成为了类型安然的代码。

有了 Graph 对象后,我们须要经由过程 FlowEngine 来触发它:

import org.noear.solon.flow.Graph;public class FlowConfig {    public Graph buildOrderFlow() {        // 应用 Fluent API 构建        return Graph.create("order_flow", "订单处理流程", spec -> {            // 1. 定义开端节点并连接到下一个            spec.addStart("n1").title("开端").linkAdd("n2");            // 2. 定义营业节点,绑定对应的 Bean 标识            spec.addActivity("n2")                    .title("库存检查")                    .task("@checkStock") // 接洽关系上面定义的 Bean(安闲器获取)                    .linkAdd("n3");            spec.addActivity("n3")                    .title("付出")                    .task(new PayProcessor()) //硬编码方法(不消经由容器)                    .linkAdd("n4");            // 3. 定义停止节点            spec.addEnd("n4").title("停止");        });    }}

4、关键 API 深度解析

  • spec.addStart(id) / addEnd(id):定义流程的界线。每一个图必须有且只有一个 Start 节点,可以有多个 End 节点。
  • spec.addActivity(id):这是最常用的节点,代表一个具体义务。
  • .task("@beanName"):这是核心联动点。@ 符号告诉 Solon 去容器中寻找对应的处理器。
  • .linkAdd(targetId):最简单的单向连线。它建立了一个从当前节点到目标节点的直接流转。

5、若何运行这个图?

import org.noear.solon.annotation.Component;import org.noear.solon.annotation.Inject;import org.noear.solon.flow.FlowContext;import org.noear.solon.flow.FlowEngine;import org.noear.solon.flow.Graph;@Componentpublic class OrderService {    @Inject    FlowEngine flowEngine;    public void processOrder() {        // 1. 构建图(实际临盆中平日会缓存此对象)        Graph orderGraph = new FlowConfig().buildOrderFlow();        // 2. 预备履行高低文(可以携带营业参数)        FlowContext context = FlowContext.of("ORD-20231024");        // 3. 履行流程        flowEngine.eval(orderGraph, context);    }}

总结与预告

然则,实际中的流程往往不是一条直线。 假如库存不足怎么办?假如金额巨大年夜须要人工审批怎么办?

在后面的 《逻辑之魂 —— 节点的“前提流转”与表达式》 中,我们将引入“分支断定”,让你的 Graph 真正具备处理复杂营业的才能。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部