Solon Flow v3.4.0 轻量级流程编排框架

Solon Flow 是一个轻量级流程编排框架(采用 yaml 或 json 偏平式编排格式)

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

有可视化的设计器:

嵌入第三方框架的示例:

同时兼容 java8 ~ java24。也可嵌入到 SpringBoot、jFinal、Vert.x 等框架中使用。

一、最近更新了什么?

  • 调整 solon-flow stateful 相关概念(提交活动状态,改为提交操作)
  • 调整 solon-flow StateType 拆分为:StateType 和 Operation
  • 调整 solon-flow StatefulFlowEngine:postActivityState 更名为 postOperation
  • 调整 solon-flow StatefulFlowEngine:postActivityStateIfWaiting 更名为 postOperationIfWaiting
  • 调整 solon-flow StatefulFlowEngine:getActivity 更名为 getTask
  • 调整 solon-flow StatefulFlowEngine:getActivitys 更名为 getTasks
  • 调整 solon-flow StatefulFlowEngine 更名为 FlowStatefulService(确保引擎的单一性)
  • 添加 solon-flow FlowStatefulService 接口,替换 StatefulFlowEngine(确保引擎的单一性)
  • 添加 solon-flow FlowEngine:statefulService() 方法
  • 添加 solon-flow FlowEngine:getDriverAs() 方法

方法名称调整:

旧方法 新方法
getActivityNodes getTasks
getActivityNode getTask
postActivityStateIfWaiting postOperationIfWaiting
postActivityState postOperation

状态类型拆解后的对应关系(之前状态与操作混一起,不合理)

StateType(旧) StateType(新) Operation(新)
UNKNOWN(0) UNKNOWN(0) UNKNOWN(0)
WAITING(1001) WAITING(1001) BACK(1001)
COMPLETED(1002) COMPLETED(1002) FORWARD(1002)
TERMINATED(1003) TERMINATED(1003) TERMINATED(1003)
RETURNED(1004) BACK(1001)
RESTART(1005) RESTART(1004)

二、特色展示

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", meta: {cc: "demo@noear.org"}, task: "@MetaProcessCom"}
  - { 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.<String,String>eventBus().send("demo.topic", "hello");  //支持泛型(类型按需指定,不指定时为 object)
  - task: |
      //发送并要求响应(就是要给答复)
      String rst = context.<String,String>eventBus().sendAndRequest("demo.topic.get", "hello");
      System.out.println(rst);

5、支持无状态、有状态两种应用

支持丰富的应用场景:

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

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

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

这是一个定制后的,支持基于有状态驱动的流程引擎效果(比如支持行政审批)。

java 复制代码
FlowEngine flowEngine = FlowEngine.newInstance(StatefulSimpleFlowDriver.builder()
                .stateOperator(new MetaStateOperator("actor"))
                .stateRepository(new InMemoryStateRepository())
                .build());
FlowStatefulService statefulService =  flowEngine.statefulService();
                
var context = new FlowContext("i1").put("actor", "陈鑫");

//获取上下文用户的任务
var task = statefulService.getTask("f1", context);

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

//提交操作
statefulService.postOperation(context, task.getNode(), Operation.COMPLETED);

流程配置样例:

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

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

相关推荐
艾伦~耶格尔4 小时前
【数据结构进阶】
java·开发语言·数据结构·学习·面试
爪洼传承人4 小时前
18- 网络编程
java·网络编程
smileNicky4 小时前
SpringBoot系列之从繁琐配置到一键启动之旅
java·spring boot·后端
祈祷苍天赐我java之术4 小时前
Java 迭代器(Iterator)详解
java·开发语言
David爱编程5 小时前
为什么必须学并发编程?一文带你看懂从单线程到多线程的演进史
java·后端
我命由我123455 小时前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
long3165 小时前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
摇滚侠5 小时前
HTML <iframe> 标签 如何把html写入iframe标签
java
云间月13146 小时前
飞算JavaAI:从智能调度到出行服务的全链路技术升级
java·redis·飞算javaai炫技赛
不太可爱的叶某人8 小时前
【学习笔记】Java并发编程的艺术——第6章 Java并发容器和框架
java·笔记·学习