引言:为什么 Flowable 是现代企业流程引擎的首选?
在数字化转型的浪潮中,企业业务流程的自动化与智能化已成为提升效率的关键。想象一下,当你需要处理请假审批、报销流程、客户工单时,一个高效的流程引擎能为企业节省多少时间和人力成本?Flowable 作为目前最流行的开源流程引擎之一,凭借其开源免费、功能强大、易于集成的特点,已成为众多企业的首选。
本文将带你从零基础到实战专家,全面掌握 Flowable 流程引擎的核心技术与最佳实践。无论你是需要为现有系统添加流程能力,还是从零构建一个完整的工作流平台,本指南都能为你提供清晰的路线图和可直接复用的代码实例。
一、Flowable 核心概念与架构解析
1.1 什么是 Flowable?
Flowable 是一个开源的业务流程引擎,它实现了 BPMN 2.0 规范,可以将业务流程用标准化的图形方式描述,并自动执行这些流程。简单来说,Flowable 就像是一个 \”流程操作系统\”,负责管理流程的创建、执行、监控和优化。
1.2 Flowable 的核心组件
Flowable 由多个服务组件构成,每个组件负责不同的功能:

- RepositoryService:管理流程定义的部署和查询
- RuntimeService:处理流程实例的启动和运行
- TaskService:管理用户任务的创建、分配和完成
- HistoryService:记录和查询流程的历史数据
- IdentityService:管理用户、组和权限
- ManagementService:引擎的管理和维护
- FormService:处理流程表单的提交和展示
1.3 Flowable 的数据库设计
Flowable 需要一系列数据库表来存储流程定义、实例、任务等数据。这些表名均以 \”ACT_\” 开头,按功能分为几大类:

MySQL 数据库初始化脚本示例(关键表):
— 流程定义表
CREATE TABLE ACT_RE_PROCDEF (
ID_ VARCHAR(64) NOT NULL,
REV_ INT NOT NULL,
CATEGORY_ VARCHAR(255),
NAME_ VARCHAR(255),
KEY_ VARCHAR(255) NOT NULL,
VERSION_ INT NOT NULL,
DEPLOYMENT_ID_ VARCHAR(64),
RESOURCE_NAME_ VARCHAR(4000),
DGRM_RESOURCE_NAME_ VARCHAR(4000),
DESCRIPTION_ VARCHAR(4000),
HAS_START_FORM_KEY_ BOOLEAN,
HAS_GRAPHICAL_NOTATION_ BOOLEAN,
SUSPENSION_STATE_ INT,
TENANT_ID_ VARCHAR(64) DEFAULT \’\’,
ENGINE_VERSION_ VARCHAR(255),
PRIMARY KEY (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
— 流程实例表
CREATE TABLE ACT_RU_EXECUTION (
ID_ VARCHAR(64) NOT NULL,
REV_ INT NOT NULL,
PROC_INST_ID_ VARCHAR(64),
BUSINESS_KEY_ VARCHAR(255),
PARENT_ID_ VARCHAR(64),
PROC_DEF_ID_ VARCHAR(64),
SUPER_EXEC_ VARCHAR(64),
ACT_ID_ VARCHAR(255),
IS_ACTIVE_ BOOLEAN,
IS_CONCURRENT_ BOOLEAN,
IS_SCOPE_ BOOLEAN,
IS_EVENT_SCOPE_ BOOLEAN,
SUSPENSION_STATE_ INT,
CACHED_ENT_STATE_ INT,
TENANT_ID_ VARCHAR(64) DEFAULT \’\’,
NAME_ VARCHAR(255),
LOCK_TIME_ DATETIME(3),
PRIMARY KEY (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
— 用户任务表
CREATE TABLE ACT_RU_TASK (
ID_ VARCHAR(64) NOT NULL,
REV_ INT NOT NULL,
NAME_ VARCHAR(255) NOT NULL,
PARENT_TASK_ID_ VARCHAR(64),
DESCRIPTION_ VARCHAR(4000),
PRIORITY_ INT,
CREATE_TIME_ DATETIME(3) NOT NULL,
OWNER_ VARCHAR(64),
ASSIGNEE_ VARCHAR(64),
DELEGATION_ VARCHAR(64),
EXECUTION_ID_ VARCHAR(64),
PROC_INST_ID_ VARCHAR(64),
PROC_DEF_ID_ VARCHAR(64),
TASK_DEF_KEY_ VARCHAR(255),
DUE_DATE_ DATETIME(3),
CATEGORY_ VARCHAR(255),
SUSPENSION_STATE_ INT,
TENANT_ID_ VARCHAR(64) DEFAULT \’\’,
FORM_KEY_ VARCHAR(255),
CLAIM_TIME_ DATETIME(3),
PRIMARY KEY (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
二、环境搭建:从零开始配置 Flowable
2.1 Maven 依赖配置
要在 Spring Boot 项目中使用 Flowable,需要添加以下 Maven 依赖:
<?xml version=\”1.0\” encoding=\”UTF-8\”?>
<project xmlns=\”http://maven.apache.org/POM/4.0.0\” xmlns:xsi=\”http://www.w3.org/2001/XMLSchema-instance\”
xsi:schemaLocation=\”http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\”>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>flowable-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>flowable-demo</name>
<description>Flowable实战示例项目</description>
<properties>
<java.version>17</java.version>
<flowable.version>7.0.1</flowable.version>
<mybatis-plus.version>3.5.6</mybatis-plus.version>
<fastjson2.version>2.0.48</fastjson2.version>
<lombok.version>1.18.30</lombok.version>
<guava.version>33.2.1-jre</guava.version>
<springdoc.version>2.3.0</springdoc.version>
</properties>
<dependencies>
<!– Spring Boot核心 –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!– Flowable –>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>${flowable.version}</version>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-rest-api</artifactId>
<version>${flowable.version}</version>
</dependency>
<!– 数据库 –>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!– MyBatis-Plus –>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!– 工具类 –>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
<!– API文档 –>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${springdoc.version}</version>
</dependency>
<!– 测试 –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2 配置文件
application.yml 配置文件:
spring:
datasource:
url: jdbc:mysql://localhost:3306/flowable_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# Flowable配置
flowable:
# 自动部署流程定义
check-process-definitions: true
# 流程定义部署路径
process-definition-location-prefix: classpath:/processes/
# 数据库升级策略
database-schema-update: true
# 历史级别:full表示记录所有历史数据
history-level: full
# 异步执行器配置
async-executor-activate: true
# 日志配置
logging:
level:
org.flowable: INFO
com.example.flowabledemo: DEBUG
# 服务器配置
server:
port: 8080
# MyBatis-Plus配置
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
type-aliases-package: com.example.flowabledemo.entity
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# SpringDoc配置
springdoc:
api-docs:
path: /api-docs
swagger-ui:
path: /swagger-ui.html
operationsSorter: method
2.3 启动类
package com.example.flowabledemo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
/**
* Flowable示例项目启动类
*
* @author ken
*/
@SpringBootApplication
@MapperScan(\”com.example.flowabledemo.mapper\”)
@ComponentScan(\”com.example.flowabledemo\”)
public class FlowableDemoApplication {
public static void main(String[] args) {
SpringApplication.run(FlowableDemoApplication.class, args);
}
}
三、Flowable 基础操作:流程定义与实例管理
3.1 流程定义的创建与部署
流程定义是 Flowable 的核心,通常使用 BPMN 2.0 格式的 XML 文件来描述。我们以一个简单的请假流程为例:
请假流程 BPMN 定义(src/main/resources/processes/leave-process.bpmn20.xml):
<?xml version=\”1.0\” encoding=\”UTF-8\”?>
<definitions xmlns=\”http://www.omg.org/spec/BPMN/20100524/MODEL\”
xmlns:xsi=\”http://www.w3.org/2001/XMLSchema-instance\”
xmlns:xsd=\”http://www.w3.org/2001/XMLSchema\”
xmlns:bpmndi=\”http://www.omg.org/spec/BPMN/20100524/DI\”
xmlns:omgdc=\”http://www.omg.org/spec/DD/20100524/DC\”
xmlns:omgdi=\”http://www.omg.org/spec/DD/20100524/DI\”
xmlns:flowable=\”http://flowable.org/bpmn\”
typeLanguage=\”http://www.w3.org/2001/XMLSchema\”
expressionLanguage=\”http://www.w3.org/1999/XPath\”
targetNamespace=\”http://flowable.org/examples\”>
<process id=\”leaveProcess\” name=\”请假流程\” isExecutable=\”true\”>
<!– 开始事件 –>
<startEvent id=\”startEvent1\” flowable:formKey=\”leaveApplyForm\”/>
<!– 请假申请任务 –>
<userTask id=\”applyTask\” name=\”请假申请\” flowable:assignee=\”${applyUserId}\”>
<extensionElements>
<flowable:formData>
<flowable:formField id=\”startDate\” name=\”开始日期\” type=\”date\”/>
<flowable:formField id=\”endDate\” name=\”结束日期\” type=\”date\”/>
<flowable:formField id=\”reason\” name=\”请假原因\” type=\”string\”/>
<flowable:formField id=\”days\” name=\”请假天数\” type=\”long\”/>
</flowable:formData>
</extensionElements>
</userTask>
<!– 排他网关 – 判断请假天数 –>
<exclusiveGateway id=\”decisionGateway\”/>
<!– 部门经理审批 –>
<userTask id=\”deptManagerApproval\” name=\”部门经理审批\” flowable:assignee=\”${deptManagerId}\”>
<extensionElements>
<flowable:formData>
<flowable:formField id=\”approvalResult\” name=\”审批结果\” type=\”enum\”>
<flowable:value id=\”approve\” name=\”同意\”/>
<flowable:value id=\”reject\” name=\”拒绝\”/>
</flowable:formField>
<flowabl



