Skip to content

Solon Flow 通用流程编排框架(支持 json 和 yaml 编排格式)。可用于计算(或任务)的编排场景; 可用于业务规则和决策处理型的编排场景; 可用于办公审批型(有状态、可中断,人员参与)的编排场景; 可用于长时间流程(结合自动前进,等待介入)的编排场景。同时兼容 java8 ~ java25。也可嵌入到 SpringBoot2、jFinal、Vert.x 等框架中使用。

License

Notifications You must be signed in to change notification settings

opensolon/solon-flow

Repository files navigation


Solon-Flow

Java 通用流程编排框架(采用 yaml 和 json 编排格式)
克制、高效、开放

https://solon.noear.org/article/learn-solon-flow

Ask DeepWiki Maven Apache 2 jdk-8 jdk-11 jdk-17 jdk-21 jdk-25
gitee star github star gitcode star


简介

面向全场景的 Java 流程编排框架。是 Solon 项目的一部分。也可嵌入到 SpringBoot、jFinal、Vert.x 等框架中使用。

支持已知流程编排的各种场景:

  • 可用于计算(或任务)的编排场景
  • 可用于业务规则和决策处理型的编排场景
  • 可用于办公审批型(有状态、可中断,人员参与)的编排场景
  • 可用于可中断、可恢复流程(结合自动前进,等待介入)的编排场景

可视化设计器:

嵌入第三方框架的示例:

主要概念

概念 简称 备注 相关接口
流程图 图(或流图) Graph, GraphDecl
流程节点 节点(或流节点) 可带任务,可带任务条件 Node, NodeDecl
流程连接线 连接(或流连接) 可带连接条件 Link, LinkDecl
流程引擎(用于执行图) 引擎(流引擎) FlowEngine
流程驱动器 驱动器(流驱动器) FlowDriver
流程上下文 上下文(或流上下文) FlowContext
流程拦截器 拦截器(或流拦截器) FlowInterceptor

概念关系描述(就像用工具画图):

  • 一个图(Graph),由多个节点(Node)和连接(Link)组成。
  • 一个节点(Node),会有多个连接(Link,也叫“流出连接”)连向别的节点。
    • 连接向其它节点,称为:流出连接。
    • 被其它节点连接,称为:流入连接。
  • 一个图“必须有且只有”一个 start 类型的节点,且从 start 节点开始,顺着连接(Link)流出。
  • 引擎在执行图的过程,可以有上下文(FlowContext),可以被阻断分支或停止执行(有状态流程)

通俗些,一个图就是通过 “点”(节点) + “线”(连接)画出来的一个结构。

六大特性展示

1、采用 yaml 和 json 偏平式编排格式

配置简洁,关系清晰。内容多了后有点像 docker-compose。

# 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、元数据配置,为扩展提供了无限空间(每个流程,相当于自带了元数据库)

# c3.yml
id: "c3"
layout: 
  - { id: "n1", type: "start", link: "n2"}
  - { id: "n2", type: "activity", link: "n3", meta: {cc: "[email protected]"}, task: "@MetaProcessCom"}
  - { 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().call("demo.topic.get", "hello").get();
      System.out.println(rst);

5、支持“无状态”、“有状态”两种需求分类

支持丰富的应用场景:

  • 支持无状态流程
    • 可用于计算(或任务)的编排场景
    • 可用于业务规则和决策处理型的编排场景
  • 支持有状态流程
    • 可用于办公审批型(有状态、可中断,人员参与)的编排场景
    • 可用于长时间流程(结合自动前进,等待介入)的编排场景

自身也相当于一个低代码的运行引擎(单个 yml 或 json 文件,即可满足所有的执行需求)。

6、驱动定制(是像 JDBC 有 MySql, PostgreSQL,还可能有 Elasticsearch)

这是一个定制后的,支持基于状态驱动的流引擎效果。

public class DemoFlowDriver implements FlowDriver {
    ...
}

FlowEngine flowEngine =FlowEngine.newInstance(new DemoFlowDriver());

StateController stateController = new ActorStateController("actor");
StateRepository stateRepository = new InMemoryStateRepository();
                
var context = FlowContext.of("i1", stateController, stateRepository).put("actor", "陈鑫");

//获取上下文用户的活动节点
var task = flowEngine.forStateful().getTask("f1", context);

assert "step2".equals(task.getNode().getId());
assert StateType.UNKNOWN == task.getState(); //没有权限启动任务(因为没有配置操作员)

//提交操作
flowEngine.forStateful().postOperation(context, "f1", task.getNode().getId(), Operation.FORWARD);

流程配置样例:

id: f1
layout:
  - {id: step1, title: "发起审批", type: "start"}
  - {id: step2, title: "抄送", meta: {cc: "吕方"}, task: "@OaMetaProcessCom"}
  - {id: step3, title: "审批", meta: {actor: "陈鑫", cc: "吕方"}, task: "@OaMetaProcessCom"}
  - {id: step4, title: "审批", type: "parallel", link: [step4_1, step4_2]}
  - {id: step4_1, meta: {actor: "陈宇"}, link: step4_end}
  - {id: step4_2, meta: {actor: "吕方"}, link: step4_end}
  - {id: step4_end, type: "parallel"}
  - {id: step5, title: "抄送", meta: {cc: "吕方"}, task: "@OaMetaProcessCom"}
  - {id: step6, title: "结束", type: "end"}

对于驱动器的定制,我们还可以:定制(或选择)不同的脚本执行器、组件容器实现等。

Solon 项目相关代码仓库

代码仓库 描述
/opensolon/solon Solon ,主代码仓库
/opensolon/solon-examples Solon ,官网配套示例代码仓库
/opensolon/solon-expression Solon Expression ,代码仓库
/opensolon/solon-flow Solon Flow ,代码仓库
/opensolon/solon-ai Solon Ai ,代码仓库
/opensolon/solon-cloud Solon Cloud ,代码仓库
/opensolon/solon-admin Solon Admin ,代码仓库
/opensolon/solon-jakarta Solon Jakarta ,代码仓库(base java21)
/opensolon/solon-integration Solon Integration ,代码仓库
/opensolon/solon-gradle-plugin Solon Gradle ,插件代码仓库
/opensolon/solon-idea-plugin Solon Idea ,插件代码仓库
/opensolon/solon-vscode-plugin Solon VsCode ,插件代码仓库

About

Solon Flow 通用流程编排框架(支持 json 和 yaml 编排格式)。可用于计算(或任务)的编排场景; 可用于业务规则和决策处理型的编排场景; 可用于办公审批型(有状态、可中断,人员参与)的编排场景; 可用于长时间流程(结合自动前进,等待介入)的编排场景。同时兼容 java8 ~ java25。也可嵌入到 SpringBoot2、jFinal、Vert.x 等框架中使用。

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •