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)
等...
