Solon Flow v3.8.0发布,通用流程编排框架升级,你期待吗?

摘要:Solon Flow 是一个面向全场景的 Java 通用流程编排框架,兼容 Java 8-25,支持计算任务、业务规则决策、可中断流程等多种编排场景。最新版本进行了重大更新,拆分为通用流程引擎 solon-flow 和工作流封装 solon
面向全场景的 Java 通用流程编排框架。同时兼容 java8 ~ java25,是 OpenSolon 的重要组成部分。支持已知流程编排的各种场景: 可用于计算(或任务)的编排场景 可用于业务规则和决策处理型的编排场景 可用于可中断、可恢复流程(结合自动前进,停止,再执行)的编排场景 可视化设计器: https://solon.noear.org/flow/designer/ 第三方开源(已组件化):https://gitee.com/opensolon/solon-flow-bpmn-designer 嵌入第三方框架(SpringBoot、jFinal、Vert.X、Quarkus、Micronaut 等)的示例: https://gitee.com/solonlab/solon-flow-embedded-examples https://gitcode.com/solonlab/solon-flow-embedded-examples https://github.com/solonlab/solon-flow-embedded-examples 一、最近更新了什么? 重要变化: 第六次预览 取消“有状态”、“无状态”概念。 solon-flow 回归通用流程引擎(分离“有状态”的概念)。 新增 solon-flow-workflow 为工作流性质的封装(未来可能会有 dataflow 等)。 具体更新: 插件 solon-flow 第六次预览 新增 solon-flow-workflow 插件(替代 FlowStatefulService) 添加 solon-flow FlowContext:lastNode() 方法(最后一个运行的节点) 添加 solon-flow FlowContext:lastNodeId() 方法(最后一个运行的节点Id) 添加 solon-flow Node.getMetaAs, Link.getMetaAs 方法 添加 solon-flow NodeSpec:linkRemove 方法(增强修改能力) 添加 solon-flow Graph:create(id,title,consumer) 方法 添加 solon-flow Graph:copy(graph,consumer) 方法(方便复制后修改) 添加 solon-flow GraphSpec:getNode(id) 方法 添加 solon-flow GraphSpec:addLoop(id) 方法替代 addLooping(后者标为弃用) 添加 solon-flow FlowEngine:eval(Graph, ..) 系列方法 优化 solon-flow FlowEngine:eval(Node startNode) 处理,改为从 root 开始恢复到 start 再开始执行(恢复过程中,不会执行任务) 调整 solon-flow 移除 Activity 节点预览属性 "$imode" 和 "$omode" 调整 solon-flow Activity 节点流出改为自由模式(可以多线流出:无条件直接流出,有条件检测后流出) 调整 solon-flow Node.getMeta 方法返回改为 Object 类型(并新增 getMetaAs) 调整 solon-flow Evaluation:runTest 改为 runCondition 调整 solon-flow FlowContext:incrAdd,incrGet 标为弃用(上下文数据为型只能由输入侧决定) 调整 solon-flow Condition 更名为 ConditionDesc 调整 solon-flow Task 更名为 ConditionDesc 调整 solon-flow GraphDecl 重命名改为 GraphSpec,NodeDecl 重命名改为 NodeSpec,LinkDecl 重命名改为 LinkSpec 调整 solon-flow GraphSpec.parseByText 重命名改为 fromText,parseByUri 重命名改为 fromUri 调整 solon-flow Graph.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 硬编码方式(及修改能力增强) //硬编码 Graph graph = Graph.create("demo1", "示例", spec -> { spec.addStart("start").title("开始").linkAdd("01"); spec.addActivity("n1").task("@AaMetaProcessCom").linkAdd("end"); spec.addEnd("end").title("结束"); }); //修改 Graph graphNew = 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) WorkflowService workflow = WorkflowService.of(engine, WorkflowDriver.builder() .stateController(new ActorStateController()) .stateRepository(new InMemoryStateRepository()) .build()); //1. 取出任务 Task task = workflow.getTask(graph, context); //2. 提交任务 workflow.postTask(task.getNode(), TaskAction.FORWARD, context); 二、特色展示 1、采用 yaml 或 json 偏平式编排格式 偏平式编排,没有深度结构(所有节点平铺,使用 link 描述连接关系)。配置简洁,关系清晰 # c1.yml id: "c1" layout: - { id: "n1", type: "start", link: "n2"} - { id: "n2", type: "activity", link: "n3"} - { id: "n3", type: "end"} 还支持简化模式(能自动推断的,都会自动处理),具体参考相关说明 # c1.yml id: "c1" layout: - { type: "start"} - { task: ""} - { type: "end"} 2、表达式与脚本自由 # c2.yml id: "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"} 3、元数据配置,为扩展提供了无限空间 元数据主要有两个作用:(1)为任务运行提供配置支持(2)为视图编辑提供配置支持 # c3.yml id: "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") public class MetaProcessCom implements TaskComponent { @Override public void run(FlowContext context, Node node) throws Throwable { String cc = node.getMeta("cc"); if(Utils.isNotEmpty(cc)){ //发送邮件... } } } 4、事件广播与回调支持 广播(即只需要发送),回调(即发送后要求给答复) id: f4 layout: - 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); 5、支持驱动定制(就像 jdbc 的驱动机制) 通过驱动定制,可方便实现: 工作流(workflow), 用于办公审批型(有状态、人员参与)的编排场景 规则流(ruleflow) 数据流(dataflow) AI流(aiflow) 等...