Flowable 是一个轻量级的业务流程管理(BPM)和工作流引擎,基于 Activiti 项目发展而来,专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。
这里要体验一下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建模方法。
以上是我创建的一个请假的审批流程:
这里就以这么一个流程为例,整合到SpringBoot中,通过提供接口的方式,实现流程的发起、待审核任务的查询、审核指定任务、回调服务代码等功能。
这里用的是flowable-spring-boot-starter
这个starter依赖,版本选用的是7.1.0,对应的JDK17,spring-boot版本3.3.8,数据库用的MySql 8,添加以下依赖:
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
8.0.28
cn.hutool
hutool-all
org.projectlombok
lombok
org.flowable
flowable-spring-boot-starter
7.1.0
配置添加数据库的连接配置即可,flowable配置基本都有默认值,如果需要修改可以看看flowable流程引擎的自动装配类ProcessEngineAutoConfiguration
相关的一些配置类FlowableProperties
等
基本不需要做什么其他配置,引入依赖后启动项目,会自动创建流程引擎相关的表,一共有62张表。
操作流程引擎最主要使用到的是以下几个核心的类,可以注入到我们的程序里:
@Resource
private ProcessEngine processEngine;
@Resource
private RepositoryService repositoryService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
用途:Flowable 的核心引擎,是所有服务的入口,用于获取其他服务实例(如 RepositoryService
、RuntimeService
等)。
用途:管理 流程定义(Process Definition) 和 部署(Deployment),操作静态资源(如 BPMN 文件)。
核心功能:
.bpmn
或 .bpmn20.xml
文件)。用途:管理 流程实例(Process Instance) 和 执行流(Execution),负责流程的启动与运行时控制。
核心功能:
用途:管理 用户任务(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 集合)
完成条件(多实例):指该多实例节点任务的完成条件,其中涉及以下几个变量:
我这里配置的是${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/
虽然中文翻译文档版本不是最新的,不过基本功能都一样