Flowable简介
Flowable 是一个轻量级的业务流程管理(BPM)和工作流引擎,基于 Activiti 项目发展而来,专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。
Flowable 的核心特点
- 基于 BPMN 2.0 标准
- 支持使用 BPMN(Business Process Model and Notation) 标准建模业务流程。
- 提供图形化设计器(如 Flowable Modeler)来设计流程。
- 轻量级 & 可嵌入
- 可以作为库集成到 Java 应用中,不依赖复杂的外部服务。
- 支持 Spring Boot 快速集成。
- 多种流程管理能力
- 支持 人工任务(User Task)、自动服务任务(Service Task)、定时器(Timer)、子流程(Subprocess) 等。
- 提供 流程实例管理、任务分配、历史数据查询 等功能。
- 支持多种数据库
- 兼容 MySQL、PostgreSQL、Oracle、SQL Server 等关系型数据库。
- REST API 支持
- 提供 Flowable REST API,方便与其他系统集成。
- 扩展性强
- 支持自定义监听器(Listeners)、变量(Variables)和脚本(如 Groovy、JavaScript)。
Flowable UI
这里要体验一下Flowable的功能的话,最方便的是用docker跑一下官方的flowable ui,脚本如下:
docker run -d -p 8080:8080 flowable/flowable-ui
跑起来访问:http://localhost:8080/flowable-ui/ ,可以看到4个应用:
- 任务应用程序:可以发起流程,处理任务等操作
- 建模器应用程序:图形化流程设计工具、流程建模
- 管理员应用程式:流程监控和管理控制台
- 身份管理应用程序:用户管理
这个主要是体验一下Flowable的功能,一般我们可能不会在项目上直接用这些应用程序,但是其中一个比较重要的应用建模器应用程序肯定是会用到的,主要是使用它对我们的业务流程进行编排,它使用的是BPMN(Business Process Model and Notation) 标准建模业务流程,提供了图形化设计器(Flowable Modeler)来设计流程。
虽然idea有插件可以支持BPMN图形化编辑,但是我并不推荐,可以装一个查看流程图,但是编辑我没有找到多节点任务相关的配置,可能是支持并不完全,所以直接使用官方提供的工具肯定是最好的。
BPMN(Business Process Model and Notation) 是一个标准建模业务流程,不只是Flowable,还有其他的一些工作流引擎同样是用的这个标准,如:Activiti、Camunda、jBPM等,所以使用以上任意一个工作流引擎都需要了解BPMN建模方法。
以上是我创建的一个请假的审批流程:
- 发起人发起请假流程,填写姓名、请假天数、理由信息
- 请假天数大于3天则由部门经理审批,请假天数小于3天则由小组leader审批
- 初审通过后由HR审核,这里创建的是多实例用户节点,可以由多个HR同时审批,任意一个HR操作审核通过即可(或签)
- 两次的审核任意一次审核驳回了,就调用服务节点,执行我们的一段Java代码,这里就是自己去实现发邮件、发短信等等操作
这里就以这么一个流程为例,整合到SpringBoot中,通过提供接口的方式,实现流程的发起、待审核任务的查询、审核指定任务、回调服务代码等功能。
flowable-spring-boot-starter
这里用的是flowable-spring-boot-starter
这个starter依赖,版本选用的是7.1.0,对应的JDK17,spring-boot版本3.3.8,数据库用的MySql 8,添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>7.1.0</version>
</dependency>
</dependencies>
配置添加数据库的连接配置即可,flowable配置基本都有默认值,如果需要修改可以看看flowable流程引擎的自动装配类ProcessEngineAutoConfiguration
相关的一些配置类FlowableProperties
等
基本不需要做什么其他配置,引入依赖后启动项目,会自动创建流程引擎相关的表,一共有62张表。
主要的服务类
操作流程引擎最主要使用到的是以下几个核心的类,可以注入到我们的程序里:
@Resource
private ProcessEngine processEngine;
@Resource
private RepositoryService repositoryService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
ProcessEngine
用途:Flowable 的核心引擎,是所有服务的入口,用于获取其他服务实例(如 RepositoryService
、RuntimeService
等)。
RepositoryService
用途:管理 流程定义(Process Definition) 和 部署(Deployment),操作静态资源(如 BPMN 文件)。
核心功能:
- 部署流程定义(
.bpmn
或.bpmn20.xml
文件)。 - 查询、删除流程定义。
- 挂起/激活流程定义。
RuntimeService
用途:管理 流程实例(Process Instance) 和 执行流(Execution),负责流程的启动与运行时控制。
核心功能:
- 启动流程实例(基于流程定义)。
- 触发流程继续执行(如通过信号事件)。
- 查询或操作运行中的流程实例。
TaskService
用途:管理 用户任务(User Task),处理人工审批环节。
核心功能:
- 查询任务(如待办任务、已完成任务)。
- 完成任务(提交审批)。
- 分配任务给用户/组。
- 设置任务变量(如审批意见)。
使用以上的几个服务类即可完成流程审批的业务流程,具体代码我已经上传到github
https://github.com/chengpei/spring-ai-demo
其中flowable-demo模块就是Flowable流程相关的代码,其他模块是spring ai相关的代码可以忽略。
流程部署
在Flowable UI章节我使用建模器应用程序创建了一个请假的审批流程,在页面上找到导出到BPMN2按钮,会下载一个xml文件,里面就是我们定义的流程描述文件,将项目的resources
目录下新建一个文件夹processes
,将流程描述文件放入到该文件夹下,重启项目即可,程序会自动读取该文件夹内的流程自动部署。
如果需要更改文件夹位置,可以修改配置flowable.processDefinitionLocationPrefix
,配置在FlowableProperties
类里
演示代码
代码我已经上传到github
https://github.com/chengpei/spring-ai-demo
主要是FlowableDemoController里的几个接口,这里就不贴代码了,直接github中找到项目的flowable-demo模块,其他模块是spring ai相关的代码请忽略,以下是接口调用的示例:
### 发起流程
GET http://localhost:8080/flowable/start?name=zhangsan&days=5&reason=不想上班
### 查询我的任务
GET http://localhost:8080/flowable/queryTask?name=manager&processId=09295702-0877-11f0-a7fe-bafcde6eec46
### 任务审核 - 通过
GET http://localhost:8080/flowable/completeTask?taskId=7d7a3749-0876-11f0-a354-bafcde6eec46&outcome=通过
### 任务审核 - 驳回
GET http://localhost:8080/flowable/completeTask?taskId=094f55a1-0877-11f0-a7fe-bafcde6eec46&outcome=驳回
### 查看任务流程图
GET http://localhost:8080/flowable/processDiagram?processId=09295702-0877-11f0-a7fe-bafcde6eec46
跑起来看看代码调用效果就可以了,也比较简单,每执行一步可以在游览器里调用查看任务流程图接口,看流程执行到哪一步了,其中唯一可能值得说一说的就是HR审核节点,是一个多实例用户节点
多实例任务节点
上述请假流程中的HR审核接口是一个多实例任务节点,所谓多实例就是该节点的处理人涉及到多人,配置如下:
多实例类型:有并行和串行两种方式,并行可能用的比较多,一般到这个接口多实例的每个处理人是同时收到这个任务,可以同时处理,这就是并行。
集合(多实例):指向一个流程变量,这个变量可以是一个数组,每个元素就是处理人
元素变量(多实例):类似for循环集合中的每一项,for (var 元素变量 in 集合)
完成条件(多实例):指该多实例节点任务的完成条件,其中涉及以下几个变量:
- nrOfInstances:实例总数。
- nrOfActiveInstances:当前活动的(即未完成的),实例数量。对于顺序多实例,这个值总为1。
- nrOfCompletedInstances:已完成的实例数量。
- loopCounter:给定实例在_for-each循环中的index_。可以通过Flowable的elementIndexVariable属性为loopCounter变量重命名。
我这里配置的是${nrOfCompletedInstances==1}
,代表多实例节点已完成的实例数量为1就算节点完成,业务上我们称它为或签,多个并行的处理人只要有一个处理了就算完成。业务上对应的还有一种会签,代表多个并行的处理人全部处理了才算完成,可以配置为${nrOfCompletedInstances==nrOfInstances}
参考中文翻译文档这个章节:https://tkjohn.github.io/flowable-userguide/#bpmnMultiInstance
参考资料:
官网网站:https://www.flowable.com/open-source
官方文档:https://www.flowable.com/open-source/docs/oss-introduction
中文翻译文档:https://tkjohn.github.io/flowable-userguide/
虽然中文翻译文档版本不是最新的,不过基本功能都一样