Featured image of post Flowable 工作流引擎实战:从 JBPM 起源到 70 张 BPMN 数据库表全解

Flowable 工作流引擎实战:从 JBPM 起源到 70 张 BPMN 数据库表全解

Flowable 6.x 起源、Activiti 关系、ACT_* 5 大表族详解、与 Camunda 选型对比

Flowable 工作流引擎实战:从 JBPM 起源到 70 张 BPMN 数据库表全解

为什么选择 Flowable

工作流引擎是企业 OA / 审批 / 业务流程的核心组件。Java 生态三大工作流框架:

引擎起源现状适合场景
JBPMRedHat/JBossDrools 规则引擎重构后偏 BPM学术研究、规则引擎
ActivitiAlfresco创始团队出走,基本停滞老项目维护
FlowableActiviti 核心团队 fork活跃维护中,新功能持续新项目首选
CamundaActiviti 另一派商业版成熟、DMN 强大型企业、商业项目

核心结论:新项目推荐 Flowable(开源活跃)+ 商业需求考虑 Camunda 7/8

JBPM → Activiti → Flowable 演进史

2003-2010:JBPM 4 时代

Jboss(被 RedHat 收购)发行 JBPM4 时,因合作伙伴关系闹翻,其中一个核心人员离职加入 Alfresco,发布 Activiti 5.0.alpha1。版本号直接从 5.0 起步,携带 JBPM4 全部特性,“正式叫板 JBPM4”。

同期,Jboss 用自研 Drools 规则引擎重构 JBPM4 → JBPM5。但因 JBoss 在国内使用率远不如 Tomcat,JBPM 后续版本在国内影响力减弱。

2010-2016:Activiti 独大

Activiti 一直在 5.0 版本迭代,6.x 引入 BPMN 2.0 完整规范、CMMN(案例管理)、DMN(决策模型)。Activiti 6 是 Flowable 的直接祖先

2016:Camunda + Flowable 双向 fork

Activiti 创作者又因合作伙伴关系不和,先后创办 CamundaFlowable。Activiti 5.0 问题修复不过来,官方放弃,两个 fork 都从 Activiti 6.0.0.Beta4 拉分支

Flowable 起步版本 5.22,直接对齐当时 Activiti 的小版本,做了"零成本迁移"。

关键时间线

年份事件
2003JBPM 1.x 起步
2010Activiti 5.0.alpha1 发布
2016-12Flowable 第一个 GA 版本(基于 Activiti 6.0.0.Beta4)
2017Flowable 6.0 GA,CMMN + DMN 完整支持
2018-2020快速迭代,6.4+ 开始分化商业版与开源版
2020+Flowable 6.4.1 后大力发展商业版,部分功能不再开源

实战坑:Flowable 6.4.1 后部分功能仅商业版(表单生成器、历史数据同步到 ES、DMN 部分功能、MongoDB 支持)。新项目选 6.3.1 或 6.4.0 仍可用开源完整功能。

70 张表全分类(按表前缀)

Flowable 启动时会在数据库创建 70+ 张表,按前缀分 5 大族:

1. ACT_RE_*(Repository 仓库表,3 张)

存储"静态"信息(流程定义、资源)。

表名作用
act_re_deployment部署记录
act_re_model部署单元信息(Modeler 设计器)
act_re_procdef已部署的流程定义

2. ACT_RU_*(Runtime 运行时表,10+ 张)

存储运行时信息(流程实例、任务、变量、作业)。流程结束时自动清理,保证运行时表小快。

表名作用
act_ru_execution运行时流程执行实例
act_ru_task运行时任务表
act_ru_variable运行时变量
act_ru_identitylink运行时用户关系(参与者)
act_ru_job / act_ru_timer_job / act_ru_deadletter_job异步作业 / 定时作业 / 死信
act_ru_actinst正在运行的节点表
act_ru_event_subscr运行时事件订阅
act_ru_suspended_job暂停的作业

3. ACT_HI_*(History 历史表,10+ 张)

存储历史数据(已完成的流程实例、变量、任务)。

表名作用
act_hi_procinst历史的流程实例
act_hi_taskinst历史的任务实例
act_hi_actinst历史的活动实例
act_hi_varinst历史的变量
act_hi_identitylink历史用户关系
act_hi_comment历史的说明性信息
act_hi_attachment历史的附件
act_hi_detail历史的细节(变量变更)
act_hi_entitylink历史的参与人员
act_hi_tsk_log任务操作日志

4. ACT_GE_*(General 通用表,2 张)

表名作用
act_ge_bytearray通用的流程定义和资源(XML、图片)
act_ge_property系统相关属性(NEXT_DBNAME_VERSION 等)

5. ACT_ID_*(Identity 身份表,9 张,极少使用

组织信息(用户、用户组)。生产环境推荐对接企业自己的 IAM,不用 Flowable 内置身份表。

表名作用
act_id_user用户基本信息
act_id_group用户组
act_id_membership用户与组关系
act_id_info用户扩展表
act_id_priv / act_id_priv_mapping权限体系
act_id_token系统登录日志
act_id_property属性表
act_id_bytearray二进制数据

6. CMMN / DMN 表族(可选)

启用 CMMN(Case Management)和 DMN(Decision Model)引擎会创建:

  • act_cmmn_*(11+ 张):CMMN 案例管理表
  • act_dmn_*(6+ 张):DMN 决策表

实战坑:CMMN 适用于"非结构化流程"(如医疗病例管理),绝大多数 OA 审批只需 BPMN。关闭 CMMN/DMNflowable.cmmn.enabled=false)可减少 20+ 张无用表。

7. ACT_FO_*(Form 表单引擎,6 张)

ACT_FO_FORM_ 开头的表存储表单定义 + 表单实例

表名作用
act_fo_form_definition表单定义
act_fo_form_deployment表单部署
act_fo_form_instance表单实例
act_fo_form_resource表单资源(JSON)
act_fo_databasechangelog / act_fo_databasechangeloglockLiquibase 迁移

6.4.1 后表单引擎部分功能仅商业版,国内项目通常用 Vue/React + 自定义表单 + Flowable 流程 API 替代。

8. ACT_EVT_LOG(事件日志表,1 张)

存储流程事件日志(任务分配、流程结束等),可通过 eventListeners 配置自定义处理。

流程操作涉及的表

部署流程

1
2
3
4
5
6
7
8
-- 1. 读取 BPMN XML
INSERT INTO act_ge_bytearray(name, bytes, ...) VALUES (..., ?, ...);

-- 2. 部署记录
INSERT INTO act_re_deployment(name, deploy_time, ...) VALUES (..., ?, ...);

-- 3. 流程定义
INSERT INTO act_re_procdef(name, key, version, deployment_id, ...) VALUES (..., ?, ?, ?, ...);

启动流程实例

1
2
3
4
5
-- 运行时实例
INSERT INTO act_ru_execution(proc_inst_id, proc_def_id, ...) VALUES (?, ?, ...);
INSERT INTO act_ru_actinst(proc_inst_id, act_id, ...) VALUES (?, ?, ...);
INSERT INTO act_ru_task(id, execution_id, assignee, ...) VALUES (?, ?, ?, ...);
INSERT INTO act_ru_variable(type, name, execution_id, ...) VALUES (?, ?, ?, ...);

处理任务

1
2
3
4
5
6
7
-- 查询待办
SELECT * FROM act_ru_task WHERE assignee = ? AND proc_def_id = ?;

-- 完成任务
DELETE FROM act_ru_task WHERE id = ?;
DELETE FROM act_ru_variable WHERE execution_id = ?;
UPDATE act_ru_execution SET act_id = ? WHERE id = ?;

流程结束

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-- 删除运行时数据
DELETE FROM act_ru_execution WHERE proc_inst_id = ?;
DELETE FROM act_ru_task WHERE execution_id IN (...);
DELETE FROM act_ru_variable WHERE execution_id IN (...);
DELETE FROM act_ru_identitylink WHERE proc_inst_id = ?;

-- 写入历史
INSERT INTO act_hi_procinst(...) VALUES (...);
INSERT INTO act_hi_taskinst(...) VALUES (...);
INSERT INTO act_hi_varinst(...) VALUES (...);

快速开始

1. 启动 Flowable UI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 下载 Flowable 6.8
wget https://github.com/flowable/flowable-engine/releases/download/flowable-6.8.0/flowable-6.8.0.zip
unzip flowable-6.8.0.zip
cd flowable-6.8.0

# 启动(默认 H2 内存数据库)
java -jar flowable-ui.war

# 浏览器访问
# http://localhost:8080/flowable-ui/#/
# 默认账号: admin / test

2. Spring Boot 集成

1
2
3
4
5
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.8.0</version>
</dependency>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# application.yml
spring:
  datasource:
    url: jdbc:mysql://{{MYSQL_HOST}}:3306/flowable?useUnicode=true&characterEncoding=UTF-8
    username: {{DB_USER}}
    password: {{DB_PASSWORD}}
flowable:
  database-schema-update: true   # 启动时自动建表
  async-executor-enabled: true   # 启用异步执行器
  cmmn-enabled: false            # 关闭 CMMN(按需)
  dmn-enabled: false             # 关闭 DMN
  history-level: audit           # 历史级别:none/activity/audit/full

3. 部署流程 + 启动实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Autowired
private RepositoryService repositoryService;

@Autowired
private RuntimeService runtimeService;

public void deployAndStart() {
    // 1. 部署 BPMN 流程
    Deployment deploy = repositoryService.createDeployment()
        .addClasspathResource("bpmn/leave.bpmn20.xml")
        .name("请假流程")
        .deploy();

    // 2. 启动流程实例
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave");
    System.out.println("流程实例 ID: " + pi.getId());
}

4. 查询待办 + 完成任务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@Autowired
private TaskService taskService;

public void completeTask(String assignee) {
    // 查询待办
    List<Task> tasks = taskService.createTaskQuery()
        .taskAssignee(assignee)
        .list();

    for (Task task : tasks) {
        System.out.println("任务: " + task.getName() + ", 流程实例: " + task.getProcessInstanceId());

        // 完成任务
        taskService.complete(task.getId());
    }
}

Flowable vs Camunda 选型

维度FlowableCamunda 7Camunda 8
架构单体 Java单体 Java云原生 Zeebe + Operate + Tasklist
开源6.4.1 前完整开源完整开源CE 限制功能,EE 商业
DMN弱(半成品)✅ 强✅ 强 + FEEL
CMMN✅ 强✅ 强移除 CMMN
性能中等中等高吞吐(Zeebe 分区日志)
Spring 集成✅ 一键 starter需手动需手动
适合传统 OA / 审批大型企业、规则密集高吞吐、流程编排

选型建议

  • OA / 审批 / < 100 TPS:Flowable
  • DMN 规则密集 / 中等吞吐:Camunda 7
  • 微服务编排 / 1000+ TPS:Camunda 8(Zeebe)

前置知识与下一步

前置

  • BPMN 2.0 规范基础(流程图绘制)
  • Spring Boot 集成
  • MySQL / 数据库基础

下一步

  • 复杂场景学 多实例任务(会签 / 或签)
  • 集成 事件网关(邮件触发流程)
  • 性能调优:async executor + job executor 线程数

小结

Flowable 是 Java 工作流引擎的事实标准之一,从 JBPM → Activiti → Flowable 的演进中积累了 20 年企业级流程经验。70 张表看似复杂,本质是 5 大族(仓库 / 运行时 / 历史 / 通用 / 身份)的职责分离。理解每张表的作用是排查流程"卡住 / 报错"问题的关键。开源版 6.4.0 仍可用,复杂需求考虑 Camunda 7/8。


2024+ 视角:Flowable 7.0 / 8.0 与 Camunda 8 的对决

Flowable 版本演进(2024+ 视角)

版本发布时间状态适用
6.4.02019最后一个完全开源版本仍有项目用
6.5 - 6.82020-2024商业版功能逐渐闭源需评估
7.02024-Q4全新架构(Open Source 优先)新项目首选
8.0(计划)2025云原生 + CMMN/DMN 重构待观察

Flowable 7.0 核心变化

  • 架构升级:基于 Spring Boot 3.x + JDK 17+ 全面重构
  • CMMN/DMN 重新开源:6.x 后期商业化的功能,7.0 重新回到社区
  • REST API 标准化:与 Cloud Flowable 平台深度集成
  • 数据库 schema 简化:从 70 张表 → 精简到 50 张左右
  • OpenAPI 文档自动生成:所有 Service 接口都有 Swagger 文档
1
2
3
4
5
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>7.0.0</version>
</dependency>

Flowable Cloud(商业版)2024+ 新变化

  • SaaS 化:直接在 flowable.com 注册账号使用
  • Cloud-native:与 K8s / OpenShift 深度集成
  • Form Engine 完整版:表单生成器 / 表单历史同步 ES
  • DMN 完整版:与商业规则引擎无缝集成

Camunda 8 持续领先

Camunda 8 基于 Zeebe 分区日志架构,是云原生时代的事实标准:

1
2
3
4
5
6
7
Spring Cloud 微服务
   Zeebe Client (gRPC)
   Zeebe Broker (分区)
   Operate / Tasklist / Optimize (Web UI)

Camunda 8 vs Flowable 7 关键差异

维度Camunda 8Flowable 7
架构云原生 + 分区日志单体 Java
性能10K+ TPS中等(< 1K TPS)
DMN✅ FEEL 标准
CMMN❌ 移除
SaaS✅(Cloud Flowable)
开源CE 限制功能核心开源完整
选型大型企业 / 流程密集中小 OA / 审批

Flowable 7 在 AI 时代的尝试

2024 内部路线图泄露(社区贡献):

  • 流程 AI 助手:自然语言转 BPMN(GPT-4 辅助)
  • 智能分配:基于历史数据自动推荐任务处理人
  • 流程挖掘(Process Mining)GA:与商业版同名功能对标 Celonis / Minit

实战:Flowable 7 + Spring Boot 3.x 启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# application.yml
spring:
  datasource:
    url: jdbc:postgresql://pg:5432/flowable
    username: flowable
    password: ${DB_PASSWORD}
  jpa:
    database-platform: org.hibernate.dialect.PostgreSQLDialect

flowable:
  # V7 配置变更
  database-schema-update: true
  cmmn-enabled: true              # 7.0 起重新开启
  dmn-enabled: true
  history-level: full
  # 异步执行器
  async-executor:
    core-pool-size: 10
    max-pool-size: 50
    queue-capacity: 200
  # V7 新增:API 兼容性
  rest-api:
    enabled: true
    base-url: /flowable-api

2024+ 选型决策树

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
工作流引擎怎么选(2024+)?
├── 中小 OA / 审批 / < 100 TPS
│   ├── 已有 Spring 团队 → Flowable 7
│   ├── 不想运维 → Camunda 8 SaaS
│   └── 简单 CRON 任务 → 直接用 @Scheduled
├── 中大型企业 / 规则密集 / DMN 多
│   └── Camunda 7(成熟稳定 + 商业支持)
├── 微服务编排 / 1000+ TPS / 云原生
│   └── Camunda 8(Zeebe 架构)
├── 大数据 ETL / 跨系统编排
│   └── Apache Airflow / DolphinScheduler
└── K8s 原生 DAG
    └── Argo Workflows / Temporal

2024+ 实战坑

  • Flowable 6.4.0 → 7.0 升级:数据库 schema 变了,必须用 flowable-upgrade 工具迁移
  • Camunda 8 SaaS 在国内访问慢——国内项目建议自建 Zeebe + Operate
  • 历史数据清理act_hi_* 表 1 年不清理可能上 GB 级别——加定时清理任务
  • DMN 业务规则:规则频繁改的业务用 Camunda DMN(FEEL 标准)+ 业务方自助维护

经验补记

  • Flowable 6.x 老项目维护:6.4.0 仍可用但 2024 后社区活跃度低,新项目建议直接 7.0
  • Camunda 7 vs 8 的迁移成本:从 7 迁 8 是重写级别——架构差异巨大
  • 流程引擎选型核心原则复杂度匹配——简单业务用复杂引擎是过度设计
使用 Hugo 构建
主题 StackJimmy 设计