工作流引擎Flowable介绍及SpringBoot整合使用实例
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/
虽然中文翻译文档版本不是最新的,不过基本功能都一样
相关文章:
工作流引擎Flowable介绍及SpringBoot整合使用实例
Flowable简介 Flowable 是一个轻量级的业务流程管理(BPM)和工作流引擎,基于 Activiti 项目发展而来,专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…...
K8s证书--运维之最佳选择(K8s Certificate - the best Choice for Operation and Maintenance)
K8s证书--运维之最佳选择 No -Number- 01 一个月速通CKA 为了速通CKA,主要办了两件事情 1. 在官方的Killercoda上,练习CKA的题目。把命令敲熟悉。 // https://killercoda.com/killer-shell-ckad 2. 使用K3s在多台虚拟机上快速搭建了K8s集群&…...
MySQL 8.0.41源码目录深度解析:探索数据库内核的架构蓝图
文章目录 MySQL 8.0.41源码目录深度解析:探索数据库内核的架构蓝图一、MySQL 8.0.41 目录结构总览1.1 安装目录核心子目录1.2 数据目录关键组件 二、核心源码模块剖析2.1 SQL 引擎核心(sql / 目录)2.1.1 核心组件2.1.2 架构亮点 2.2 存储引擎…...
Leaflet.js+leaflet.heat实现热力图
Leaflet热力图 #mermaid-svg-I1zXN0OrNCBGKEWy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-icon{fill:#552222;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-text{fill:#552222;stroke:#5522…...
通过git文件查看大模型下载链接的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
多源最短路:Floyd算法の暴力美学
多源最短路求解的是图中的任意两个节点之间的最短路。 前文我们已经讲过单源最短路,我们完全可以做n次单源最短路算法,求出任意两节点的最短距离。最快的堆优化版的 dijkstra 算法的时间复杂度为o(m * logm),枚举n次时…...
初教六双机一飞冲天动作要领
初教六双机一飞冲天动作要领 初教六双机“一飞冲天”是典型的垂直爬升特技动作,要求双机以近乎垂直的姿态同步高速爬升,展现飞机的动力性能与编队协同能力。以下是该动作的详细技术解析与执行要点: 一、动作定义与特点 基本形态 双机以相同速…...
qtcore在docker容器中运行
FROM ubuntu # 设置时区环境变量 ENV TZAsia/Shanghai RUN echo "${TZ}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ && apt update \ && apt install -y tzdata \ && rm -rf /var/lib/apt…...
simpleITK - Setup - Pythonic Syntactic Sugar
Pythonic Syntactic Sugar Image Basics Notebook 非常简单,与 ITK 的 C 接口非常接近。 Sugar非常棒,它能让你精力充沛,更快地完成任务!SimpleITK 也应用了大量Sugar来帮助更快地完成任务。 %matplotlib inline import matplo…...
【leetcode hot 100 215】数组中的第K个最大元素
解法一:维护最大最小值 -> 堆 -> k个元素的最小值堆 class Solution {public int findKthLargest(int[] nums, int k) {// 维护最大最小值 -> 堆 -> k个元素的最小值堆PriorityQueue<Integer> heap new PriorityQueue<>((n1, n2) -> n…...
下载vmware17
我用VMware10安装ubuntu24,死活不能成功,要么突然退出,要么装着装着,眼看完成,居然卡住不动,一查日志,提示光盘读取失败(用的ISO文件,居然装模作样的说光驱读取失败&…...
德昂观点:如何看待MicroStrategy改名为Strategy?
2025年2月,纳斯达克上市公司MicroStrategy(股票代码:MSTR)宣布更名为“Strategy”,并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新,更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…...
嵌入式八股RTOS与Linux---网络系统篇
前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块 这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…...
Django 生成 ssl 安全证书,切换 https、wss协议(daphne 、nginx)
Django 普通 http 协议不够安全,无法支持连接本地摄像头(虽然在本地 localhost 上能连),此时需要切换成 https 协议(先提个醒,我这个方法最后失败了,不过对您应该也有帮助) 目录 配置…...
告别Win10强制更新:永久关闭系统更新指南
你是否厌倦了Win10在开关机时的强制自动更新?无论你是在赶时间还是专注于工作,那突如其来的更新提示总是让人不胜其烦。屏幕上那句“正在更新,请勿关闭电源”的提示,仿佛是对你无奈的嘲笑。别担心,今天我将教你如何永久…...
【django】2-1 (django配置) 应用配置、中间件配置、模板配置
文章目录 1 基本设置2 应用配置2.1 django核心应用2.2 常用第三方应用 3 中间件3.1 默认使用的中间件3.2 其它内置中间件3.3 第三方中间件3.4 中间件的执行顺序 4 模板引擎配置4.1 配置字典的键4.2 上下文处理器 创建django项目后,会自动生成初始的项目文件如下&…...
nginx-rtmp-module之ngx_rtmp.c代码详解
1. ngx_rtmp.c — RTMP模块的主逻辑实现 这个文件是 RTMP 模块的核心,包含了 RTMP 协议模块的初始化、配置解析和服务端口的管理等功能。它的主要职责是处理 RTMP 配置、初始化模块、配置事件、初始化 RTMP 端口等。 主要功能和逻辑: 模块初始化 (ngx_…...
罗杰斯特回归
定义 逻辑回归其实就是原来的线性回归加了激活函数,这个函数其实就是sigmoid函数,把一个回归的连续数值压缩到了0到1的空间,其实只要有函数能够满足把数值压缩到0,1之间就可以(因为0到1之间的数值就是概率值) 对于分类…...
Android 10.0 SystemUI状态栏去掉刘海屏功能实现
1.前言 在android10.0的系统rom定制化开发中,在一些产品中,对于带有刘海屏的产品中,会因为 刘海屏导致状态栏能显示图片的位置很小,然后会出现状态栏图标显示为白点的功能, 接下来看下问题怎么解决 2.SystemUI状态栏去掉刘海屏功能实现的核心类 frameworks/base/core/r…...
三维空间中点、线、面的关系
三维空间中点、线、面的关系 点相对于平面的位置关系直线相对于平面的位置关系1.根据三点计算平面方程 //根据3点计算平面方程#include <iostream> #include <cmath> #include <vector>...
【嵌入式学习2】C语言 - VScode环境搭建
目录 ## 语言分类 ## c语言编译器 ## VScode相关配置 ## 语言分类 编译型语言:C,C解释型语言:python,JS ## c语言编译器 分类GCC 系列MinGWCygwinMSVC系列一套编程语言编译器将GCC编译器和GNU Binutils移植到Win32平台下的产物…...
TCP/IP的网络连接设备
TCP/IP层物理层网卡、集线器、中继器数据链路层网桥、交换机网络层路由器传输层网关应用层 1.网桥:网桥主要功能是将一个网络的数据沿通信线路复制到另一个网络中去,可以有效的连接两个局域网 2.网关:网关又称协议转换器,是将两…...
蓝桥杯真题 2109.统计子矩阵
原题地址:1.统计子矩阵 - 蓝桥云课 问题描述 给定一个 NMNM 的矩阵 AA, 请你统计有多少个子矩阵 (最小 1111, 最大 NM)NM) 满足子矩阵中所有数的和不超过给定的整数 KK ? 输入格式 第一行包含三个整数 N,MN,M 和 KK. 之后 NN 行每行包含 MM 个整数, 代表矩阵 AA. 输出格…...
利用脚本和Shader制作屏幕后处理效果
一、屏幕后处理的实现原理 该屏幕后处理的原理是将渲染完成后的屏幕纹理通过脚本和Shader完成一些操作,然后实现各种屏幕效果 而实现屏幕后处理效果的主要操作就是获得当下渲染完成后的屏幕图像,其中unity提供了一个函数用于获取此图像——OnRenderIma…...
【银河麒麟系统常识】命令:uname -m(查看系统架构)
命令: uname -m 功能 常用的 Linux/Unix 终端命令,用于显示当前系统的硬件架构; 返回 返回系统的CPU架构类型,用于判断软件兼容性; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...
3.1.2 内存池
文章目录 3.1.2 内存池1. 什么是内存池2. 内存管理1. 定长2. 不定长3. jemalloc4. tcmalloc 3.1.2 内存池 1. 什么是内存池 内存池(Memory Pool) 是一种 预先分配 一块大内存,然后按需分配和回收 其中小块内存的技术。它的本质是管理一块连续…...
基于SpringBoot + Vue 的餐厅点餐管理系统
SpringBootVue餐厅点餐管理系统 技术框架 后端:springboot mybatisPlus前端:Vue2 elementUI数据库:mysql项目构建工具:maven 数据库表 14张 角色及功能 管理员:登录、用户管理、餐桌信息管理、菜品类型管理、菜…...
Android开发BasePagerAdapter
Android开发BasePagerAdapter 有个基类的PagerAdapter 方便很多 public class BasePagerAdapter extends FragmentPagerAdapter {private static final String TAG "FragmentPagerAdapter";private static final boolean DEBUG false;private final FragmentMana…...
70. Linux驱动开发与裸机开发区别,字符设备驱动开发
一、裸机驱动开发回顾 1、底层,跟寄存器打交道,有些MCU提供了库。 二、Linux驱动开发思维 1、Linux下驱动开发直接操作寄存器不现实。 2、根据Linux下的各种驱动框架进行开发。一定要满足框架,也就是Linux下各种驱动框架的掌握。 3、驱动最…...
【博客节选】再谈Unity 的 root motion
节选自 【Unity实战笔记】第二十三 root motion变更方向攻击 (OnStateMove rootmotion rigidbody 使用的一些问题) 小伙伴们应该对root motion非常困惑,包括那个bake into pose。 当xz bake into pose后,角色攻击动画与父节点产…...
