通用流程编排框架,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)
  • 等...
相关推荐
学长毕设2 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw3 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号4 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场4 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠4 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David5 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放5 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261356 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长6 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节