通用流程编排框架,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)
  • 等...
相关推荐
\xin1 小时前
pikachu自编SQL(POST)
java·数据库·sql
一行代码一行诗++1 小时前
注释是什么和注释该怎么写(C语言)
java·前端·javascript
JAVA面经实录9172 小时前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
Drug2 小时前
Struts2 从入门到放弃?不,这些核心知识你依然需要掌握
java
Slow菜鸟2 小时前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能
月落归舟2 小时前
java基础之拷贝、单例
java·单例·拷贝
鬼蛟2 小时前
什么是 Git
java
直奔標竿3 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
云烟成雨TD3 小时前
Spring AI 1.x 系列【31】向量数据库:进阶使用指南
java·人工智能·spring
万邦科技Lafite3 小时前
京东开放API接口:item_get返回参数指南
java·前端·javascript·api·电商开放平台