NestJS Config装饰器详解:@Configurable与@ConfigParam实战
2026/7/27 13:56:23
面向全场景的 Java 通用流程编排框架。同时兼容 java8 ~ java25,是 OpenSolon 的重要组成部分。支持已知流程编排的各种场景:
可视化设计器:
嵌入第三方框架(SpringBoot、jFinal、Vert.X、Quarkus、Micronaut 等)的示例:
重要变化:
具体更新:
solon-flow第六次预览solon-flow-workflow插件(替代 FlowStatefulService)solon-flowFlowContext:lastNode() 方法(最后一个运行的节点)solon-flowFlowContext:lastNodeId() 方法(最后一个运行的节点Id)solon-flowNode.getMetaAs, Link.getMetaAs 方法solon-flowNodeSpec:linkRemove 方法(增强修改能力)solon-flowGraph:create(id,title,consumer) 方法solon-flowGraph:copy(graph,consumer) 方法(方便复制后修改)solon-flowGraphSpec:getNode(id) 方法solon-flowGraphSpec:addLoop(id) 方法替代 addLooping(后者标为弃用)solon-flowFlowEngine:eval(Graph, …) 系列方法solon-flowFlowEngine:eval(Node startNode) 处理,改为从 root 开始恢复到 start 再开始执行(恢复过程中,不会执行任务)solon-flow移除 Activity 节点预览属性 “i m o d e " 和 " imode" 和 "imode"和"omode”solon-flowActivity 节点流出改为自由模式(可以多线流出:无条件直接流出,有条件检测后流出)solon-flowNode.getMeta 方法返回改为 Object 类型(并新增 getMetaAs)solon-flowEvaluation:runTest 改为 runConditionsolon-flowFlowContext:incrAdd,incrGet 标为弃用(上下文数据为型只能由输入侧决定)solon-flowCondition 更名为 ConditionDescsolon-flowTask 更名为 ConditionDescsolon-flowGraphDecl 重命名改为 GraphSpec,NodeDecl 重命名改为 NodeSpec,LinkDecl 重命名改为 LinkSpecsolon-flowGraphSpec.parseByText 重命名改为 fromText,parseByUri 重命名改为 fromUrisolon-flowGraph.parseByText 重命名改为 fromText,parseByUri 重命名改为 fromUri兼容变化对照表:
| 旧名称 | 新名称 | 说明 |
|---|---|---|
GraphDecl | GraphSpec | 图定义 |
GraphDecl.parseByXxx | GraphSpec.fromXxx | 图定义加载 |
Graph.parseByXxx | Graph.fromXxx | 图加载 |
LinkDecl | LinkSpec | 连接定义 |
NodeDecl | NodeSpec | 节点定义 |
Condition | ConditionDesc | 条件描述 |
Task | TaskDesc | 任务描述(避免与 workflow 的概念冲突) |
FlowStatefulService | WorkflowService | 工作流服务 |
StatefulTask | Task | 任务 |
Operation | TaskAction | 任动工作 |
TaskType | TaskState | 任务状态 |
FlowStatefulService 到 WorkflowService 的接口变化对照表:
| 旧名称 | 新名称 | 说明 |
|---|---|---|
postOperation(..) | postTask(..) | 提交任务 |
postOperationIfWaiting(..) | postTaskIfWaiting(..) | 提交任务 |
evel(..) | / | 执行 |
stepForward(..) | / | 单步前进 |
stepBack(..) | / | 单步后退 |
| / | getState(..) | 获取状态 |
新特性预览:Graph 硬编码方式(及修改能力增强)
//硬编码Graphgraph=Graph.create("demo1","示例",spec->{spec.addStart("start").title("开始").linkAdd("01");spec.addActivity("n1").task("@AaMetaProcessCom").linkAdd("end");spec.addEnd("end").title("结束");});//修改GraphgraphNew=Graph.copy(graph,spec->{spec.getNode("n1").linkRemove("end").linkAdd("n2");//移掉 n1 连接;改为 n2 连接spec.addActivity("n2").linkAdd("end");});新特性预览:FlowContext:lastNodeId (计算的中断与恢复)。参考:https://solon.noear.org/article/1246
flowEngine.eval(graph,context.lastNodeId(),context);//...(从上一个节点开始执行)flowEngine.eval(graph,context.lastNodeId(),context);新特性预览:WorkflowService(替代 FlowStatefulService)
WorkflowServiceworkflow=WorkflowService.of(engine,WorkflowDriver.builder().stateController(newActorStateController()).stateRepository(newInMemoryStateRepository()).build());//1. 取出任务Tasktask=workflow.getTask(graph,context);//2. 提交任务workflow.postTask(task.getNode(),TaskAction.FORWARD,context);偏平式编排,没有深度结构(所有节点平铺,使用 link 描述连接关系)。配置简洁,关系清晰
# c1.ymlid:"c1"layout:-{id:"n1",type:"start",link:"n2"}-{id:"n2",type:"activity",link:"n3"}-{id:"n3",type:"end"}还支持简化模式(能自动推断的,都会自动处理),具体参考相关说明
# c1.ymlid:"c1"layout:-{type:"start"}-{task:""}-{type:"end"}# c2.ymlid:"c2"layout:-{type:"start"}-{when:"order.getAmount() >= 100",task:"order.setScore(0);"}-{when:"order.getAmount() > 100 && order.getAmount() <= 500",task:"order.setScore(100);"}-{when:"order.getAmount() > 500 && order.getAmount() <= 1000",task:"order.setScore(500);"}-{type:"end"}元数据主要有两个作用:(1)为任务运行提供配置支持(2)为视图编辑提供配置支持
# c3.ymlid:"c3"layout:-{id:"n1",type:"start",link:"n2"}-{id:"n2",type:"activity",link:"n3",task:"@MetaProcessCom",meta:{cc:"demo@noear.org"}}-{id:"n3",type:"end"}通过组件方式,实现元数据的抄送配置效果
@Component("MetaProcessCom")publicclassMetaProcessComimplementsTaskComponent{@Overridepublicvoidrun(FlowContextcontext,Nodenode)throwsThrowable{Stringcc=node.getMeta("cc");if(Utils.isNotEmpty(cc)){//发送邮件...}}}广播(即只需要发送),回调(即发送后要求给答复)
id:f4layout:-task:|//发送事件 context.eventBus().send("demo.topic", "hello"); //支持泛型(类型按需指定,不指定时为 object)-task:|//调用事件(就是要给答复) String rst = context.eventBus().<String, String>call("demo.topic.get", "hello").get(); System.out.println(rst);通过驱动定制,可方便实现: