通用流程编排框架,Solon Flow v3.8.0 隆重发布

面向全场景的 Java 通用流程编排框架。同时兼容 java8 ~ java25,是 OpenSolon 的重要组成部分。支持已知流程编排的各种场景:

  • 可用于计算(或任务)的编排场景
  • 可用于业务规则和决策处理型的编排场景
  • 可用于可中断、可恢复流程(结合自动前进,停止,再执行)的编排场景

可视化设计器:

嵌入第三方框架(SpringBoot、jFinal、Vert.X、Quarkus、Micronaut 等)的示例:

一、最近更新了什么?

重要变化:

  • 第六次预览
  • 取消"有状态"、"无状态"概念。
  • 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 硬编码方式(及修改能力增强)

java 复制代码
//硬编码
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

java 复制代码
flowEngine.eval(graph, context.lastNodeId(), context);
//...(从上一个节点开始执行)
flowEngine.eval(graph, context.lastNodeId(), context);

新特性预览:WorkflowService(替代 FlowStatefulService)

java 复制代码
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 描述连接关系)。配置简洁,关系清晰

yaml 复制代码
# c1.yml
id: "c1"
layout: 
  - { id: "n1", type: "start", link: "n2"}
  - { id: "n2", type: "activity", link: "n3"}
  - { id: "n3", type: "end"}

还支持简化模式(能自动推断的,都会自动处理),具体参考相关说明

yaml 复制代码
# c1.yml
id: "c1"
layout: 
  - { type: "start"}
  - { task: ""}
  - { type: "end"}

2、表达式与脚本自由

yaml 复制代码
# 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)为视图编辑提供配置支持

yaml 复制代码
# 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"}

通过组件方式,实现元数据的抄送配置效果

java 复制代码
@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、事件广播与回调支持

广播(即只需要发送),回调(即发送后要求给答复)

yaml 复制代码
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)
  • 等...
相关推荐
小王师傅663 小时前
【轻松入门SpringBoot】actuator健康检查(中)
java·spring boot·spring
咕噜咕噜啦啦3 小时前
Java速通(应用程序)
java·开发语言
爱学习的小可爱卢3 小时前
JavaEE进阶——Spring Bean与Java Bean的核心区别
java·后端·java-ee
期待のcode3 小时前
Java Object 类
java·开发语言
悟能不能悟4 小时前
如何处理 丢失更新(不可重复读)
java
李拾叁的摸鱼日常4 小时前
Java Optional 最佳实践+注意事项+避坑指南
java·后端·面试
雨中飘荡的记忆4 小时前
MyBatis配置解析模块详解
java·mybatis
qq_12498707534 小时前
基于微信小程序的科技助农系统的设计与实现(源码+论文+部署+安装)
java·大数据·spring boot·后端·科技·微信小程序·毕业设计
狂奔小菜鸡4 小时前
Day35 | Java多线程入门
java·后端·java ee