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

41 阅读4分钟

面向全场景的 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""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

兼容变化对照表:

旧名称新名称说明
GraphDeclGraphSpec图定义
GraphDecl.parseByXxxGraphSpec.fromXxx图定义加载
Graph.parseByXxxGraph.fromXxx图加载
LinkDeclLinkSpec连接定义
NodeDeclNodeSpec节点定义
ConditionConditionDesc条件描述
TaskTaskDesc任务描述(避免与 workflow 的概念冲突)
FlowStatefulServiceWorkflowService工作流服务
StatefulTaskTask任务
OperationTaskAction任动工作
TaskTypeTaskState任务状态

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 (计算的中断与恢复)。参考:solon.noear.org/article/124…

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