在动手写代码前,需要理解两个关键概念:
假设我们有一个简单的订单流程:开始 -> 检查库存 -> 支付 -> 结束。
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",soccer.xj.zuq8.info 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("--- 支付成功! ---");
}
}
下面是本文的核心代码。我们通过 Graph.create 启动编排:
import org.noear.solon.flow.Graph;public class FlowConfig { public Graph buildOrderFlow() { // 使用 Fluent API 构建
return Graph.create("order_flow",gov.www.dj.jrzb2.info "订单处理流程", 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("结束");
});
}
}
spec.addStart(id) / addEnd(id):定义流程的边界。每一个图必须有且只有一个 Start 节点,可以有多个 End 节点。spec.addActivity(id):这是最常用的节点,代表一个具体任务。.task("@beanName"):这是核心联动点。@ 符号告诉 Solon 去容器中寻找对应的处理器。.linkAdd(targetId):最简单的单向连线。它建立了一个从当前节点到目标节点的直接流转。有了 Graph 对象后,我们需要通过 FlowEngine 来触发它:
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; zuqiu.js.zuq8.info public void processOrder() { // 1. 构建图(实际生产中通常会缓存此对象)
Graph orderGraph = new FlowConfig().buildOrderFlow(); // 2. 准备执行上下文(可以携带业务参数)
FlowContext context = FlowContext.of("ORD-20231024"); // 3. 执行流程
flowEngine.eval(orderGraph, context);
}
}
通过本文,你已经学会了如何不依赖任何配置文件,纯手工在内存中“画”出一个流程图。这种方式极大地提高了代码的可读性,并且让“流程定义”本身也成为了类型安全的代码。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3107316/ ,如需转载,请注明出处,否则将追究法律责任。