当前位置: 首页 > article >正文

工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介

Flowable 是一个轻量级的业务流程管理(BPM)工作流引擎,基于 Activiti 项目发展而来,专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。

Flowable 的核心特点

  1. 基于 BPMN 2.0 标准
    • 支持使用 BPMN(Business Process Model and Notation) 标准建模业务流程。
    • 提供图形化设计器(如 Flowable Modeler)来设计流程。
  2. 轻量级 & 可嵌入
    • 可以作为库集成到 Java 应用中,不依赖复杂的外部服务。
    • 支持 Spring Boot 快速集成。
  3. 多种流程管理能力
    • 支持 人工任务(User Task)自动服务任务(Service Task)定时器(Timer)子流程(Subprocess) 等。
    • 提供 流程实例管理任务分配历史数据查询 等功能。
  4. 支持多种数据库
    • 兼容 MySQL、PostgreSQL、Oracle、SQL Server 等关系型数据库。
  5. REST API 支持
    • 提供 Flowable REST API,方便与其他系统集成。
  6. 扩展性强
    • 支持自定义监听器(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个应用:

  1. 任务应用程序:可以发起流程,处理任务等操作
  2. 建模器应用程序:图形化流程设计工具、流程建模
  3. 管理员应用程式:流程监控和管理控制台
  4. 身份管理应用程序:用户管理

这个主要是体验一下Flowable的功能,一般我们可能不会在项目上直接用这些应用程序,但是其中一个比较重要的应用建模器应用程序肯定是会用到的,主要是使用它对我们的业务流程进行编排,它使用的是BPMN(Business Process Model and Notation) 标准建模业务流程,提供了图形化设计器(Flowable Modeler)来设计流程。
虽然idea有插件可以支持BPMN图形化编辑,但是我并不推荐,可以装一个查看流程图,但是编辑我没有找到多节点任务相关的配置,可能是支持并不完全,所以直接使用官方提供的工具肯定是最好的。
BPMN(Business Process Model and Notation) 是一个标准建模业务流程,不只是Flowable,还有其他的一些工作流引擎同样是用的这个标准,如:Activiti、Camunda、jBPM等,所以使用以上任意一个工作流引擎都需要了解BPMN建模方法。
https://chengpei.top/upload/flowable-modeler.jpg
以上是我创建的一个请假的审批流程:

  1. 发起人发起请假流程,填写姓名、请假天数、理由信息
  2. 请假天数大于3天则由部门经理审批,请假天数小于3天则由小组leader审批
  3. 初审通过后由HR审核,这里创建的是多实例用户节点,可以由多个HR同时审批,任意一个HR操作审核通过即可(或签)
  4. 两次的审核任意一次审核驳回了,就调用服务节点,执行我们的一段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 的核心引擎,是所有服务的入口,用于获取其他服务实例(如 RepositoryServiceRuntimeService 等)。

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审核接口是一个多实例任务节点,所谓多实例就是该节点的处理人涉及到多人,配置如下:
https://www.chengpei.top/upload/flowable-duoshili.png
多实例类型:有并行和串行两种方式,并行可能用的比较多,一般到这个接口多实例的每个处理人是同时收到这个任务,可以同时处理,这就是并行。
集合(多实例):指向一个流程变量,这个变量可以是一个数组,每个元素就是处理人
元素变量(多实例):类似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/
虽然中文翻译文档版本不是最新的,不过基本功能都一样


http://www.kler.cn/a/612317.html

相关文章:

  • ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程
  • 什么是 Promise?
  • 在鸿蒙 ArkUI 中使用本地数据缓存
  • 【数学建模】(启发式算法)蚁群算法(Ant Colony Optimization)的详解与应用
  • 深入理解椭圆曲线密码学(ECC)与区块链加密
  • 蓝桥杯模拟题--约数的个数(约数和质因数的区别)
  • spring-ai ollama小试牛刀
  • DaemonSet 与 Deployment 的主要区别
  • VSCode 抽风之 两个conda环境同时在被激活
  • 数字图像处理 -- 霍夫曼编码(无损压缩)练习
  • 解决electron-builder vue 打包后element-ui字体图标不显示问题
  • Redis之缓存双写一致性理论分析
  • 数字孪生技术:重塑UI前端的未来
  • C++实现Nadaraya - Watson 核回归计算难题实录:从 O (n²) 到高效优化
  • MybatisPlus(SpringBoot版)学习第四讲:常用注解
  • 【MLP-BEV(10)】BEVPooling V1和BEVPooling V2的view_transformer,进行鱼眼图片实践
  • Android Token的原理和本地安全存储
  • 智能遥感新质生产力暨DeepSeek、Python、OpenCV驱动的空天地数据识别与计算及15个行业标杆案例
  • 代码随想录算法训练营第五十八天 | 拓扑排序精讲 dijkstra(朴素版)精讲
  • css 实现闪烁光标