1. Activiti7流程引擎表结构全景解析
作为一款开源的工作流引擎,Activiti7通过精心设计的数据库表结构来支撑整个流程生命周期管理。这套表结构就像流程引擎的"骨架",理解每张表的职责对开发调试和性能优化都至关重要。我在多个企业级流程项目中,发现80%的流程异常都与表数据状态不一致有关。
Activiti7的表命名遵循"ACT_"前缀+模块标识+业务含义的规则,主要分为五大类:运行时数据表(RU)、历史数据表(HI)、身份信息表(ID)、流程定义表(RE)和通用数据表(GE)。下面我们就逐层拆解这套表结构体系。
1.1 运行时数据表(ACT_RU_*)
运行时表就像流程引擎的"工作内存",记录所有正在运行的流程实例数据。这些表的特点是读写频繁,数据生命周期与流程实例同步。
ACT_RU_EXECUTION(执行实例表)
sql复制CREATE TABLE ACT_RU_EXECUTION (
ID_ varchar(64) NOT NULL,
REV_ int(11) DEFAULT NULL,
PROC_INST_ID_ varchar(64) DEFAULT NULL,
BUSINESS_KEY_ varchar(255) DEFAULT NULL,
PARENT_ID_ varchar(64) DEFAULT NULL,
PROC_DEF_ID_ varchar(64) DEFAULT NULL,
SUPER_EXEC_ varchar(64) DEFAULT NULL,
ACT_ID_ varchar(255) DEFAULT NULL,
IS_ACTIVE_ tinyint(4) DEFAULT NULL,
IS_CONCURRENT_ tinyint(4) DEFAULT NULL,
IS_SCOPE_ tinyint(4) DEFAULT NULL,
IS_EVENT_SCOPE_ tinyint(4) DEFAULT NULL,
SUSPENSION_STATE_ int(11) DEFAULT NULL,
CACHED_ENT_STATE_ int(11) DEFAULT NULL,
TENANT_ID_ varchar(255) DEFAULT '',
PRIMARY KEY (ID_)
);
这是最核心的运行时表之一,记录流程实例和分支执行的当前状态。关键字段解析:
PROC_INST_ID_:流程实例ID,整个流程生命周期的唯一标识ACT_ID_:当前活动节点ID,对应流程定义XML中的元素SUSPENSION_STATE_:挂起状态(1激活/2挂起)
实际项目中要特别注意
IS_ACTIVE_字段,当流程出现"卡住"现象时,很可能是因为该字段状态异常。
ACT_RU_TASK(任务表)
存储所有待办任务信息,每个用户任务都会在此生成记录。重要字段包括:
ASSIGNEE_:任务处理人(直接分配)CANDIDATE_:候选人或候选组(需要签收的任务)DUE_DATE_:任务截止时间(用于超时监控)
ACT_RU_VARIABLE(变量表)
采用键值对形式存储流程变量,支持多种数据类型:
TYPE_字段标识变量类型(string/integer/long...)- 大文本数据会存储在
BYTEARRAY_关联的ACT_GE_BYTEARRAY表中
1.2 历史数据表(ACT_HI_*)
历史表如同流程引擎的"黑匣子",完整记录流程执行轨迹。即使流程结束,这些数据依然保留用于审计和分析。
ACT_HI_PROCINST(流程实例历史表)
与RU_EXECUTION不同,这里每条记录代表一个完整的流程实例:
START_TIME_/END_TIME_:记录流程耗时START_USER_ID_:流程发起人DELETE_REASON_:记录流程终止原因(正常结束/人工删除)
ACT_HI_ACTINST(活动实例历史表)
最常用的历史分析表,记录每个节点的执行详情:
sql复制SELECT * FROM ACT_HI_ACTINST
WHERE PROC_DEF_ID_ = 'leaveProcess:1:123'
ORDER BY START_TIME_ DESC;
通过该表可以还原出完整的流程流转路径,字段DURATION_特别适合用于分析节点处理时效。
1.3 身份表(ACT_ID_*)
身份体系表存储用户、组和关系数据,支持与LDAP等系统集成:
ACT_ID_USER(用户表)
标准用户信息表,注意:
PICTURE_ID_字段关联ACT_GE_BYTEARRAY存储头像- 实际项目通常会禁用内置身份服务,对接企业SSO
ACT_ID_MEMBERSHIP(用户组关系表)
多对多关联表,结构非常简单:
sql复制CREATE TABLE ACT_ID_MEMBERSHIP (
USER_ID_ varchar(64) NOT NULL,
GROUP_ID_ varchar(64) NOT NULL,
PRIMARY KEY (USER_ID_,GROUP_ID_)
);
1.4 流程定义表(ACT_RE_*)
存储部署的流程定义资源:
ACT_RE_DEPLOYMENT(部署表)
每次部署生成一条记录,关键字段:
DEPLOY_TIME_:部署时间戳CATEGORY_:分类标签(用于多环境区分)
ACT_RE_PROCDEF(流程定义表)
sql复制CREATE TABLE ACT_RE_PROCDEF (
ID_ varchar(64) NOT NULL,
REV_ int(11) DEFAULT NULL,
CATEGORY_ varchar(255) DEFAULT NULL,
NAME_ varchar(255) DEFAULT NULL,
KEY_ varchar(255) NOT NULL,
VERSION_ int(11) NOT NULL,
DEPLOYMENT_ID_ varchar(64) DEFAULT NULL,
RESOURCE_NAME_ varchar(4000) DEFAULT NULL,
DGRM_RESOURCE_NAME_ varchar(4000) DEFAULT NULL,
DESCRIPTION_ varchar(4000) DEFAULT NULL,
HAS_START_FORM_KEY_ tinyint(4) DEFAULT NULL,
SUSPENSION_STATE_ int(11) DEFAULT NULL,
TENANT_ID_ varchar(255) DEFAULT '',
PRIMARY KEY (ID_)
);
特别注意KEY_和VERSION_的组合构成唯一标识,如"leaveProcess:1:123"表示流程key为leaveProcess的第1个版本。
1.5 通用表(ACT_GE_*)
ACT_GE_BYTEARRAY(二进制资源表)
存储所有二进制数据,包括:
- 部署的流程定义文件(.bpmn/.png)
- 流程变量中的序列化对象
- 用户头像等附件
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 表关联与数据流转机制
2.1 流程实例生命周期数据流
当启动一个新流程实例时,数据流转如下:
- 从ACT_RE_PROCDEF读取流程定义
- 在ACT_RU_EXECUTION创建主执行记录
- 在ACT_RU_TASK生成初始任务
- 在ACT_HI_PROCINST和ACT_HI_ACTINST生成历史快照
2.2 关键表关联关系
sql复制-- 查询运行中流程的完整信息
SELECT t.*, v.TEXT_ AS assignee_name
FROM ACT_RU_TASK t
LEFT JOIN ACT_RU_VARIABLE v ON t.ASSIGNEE_ = v.TEXT_
WHERE t.PROC_DEF_ID_ = 'processDefId';
3. 实战中的表操作技巧
3.1 常见查询模板
查询某用户待办任务
sql复制SELECT t.*, p.NAME_ AS process_name
FROM ACT_RU_TASK t
JOIN ACT_RE_PROCDEF p ON t.PROC_DEF_ID_ = p.ID_
WHERE t.ASSIGNEE_ = 'userId';
流程变量高效查询
java复制runtimeService.createVariableInstanceQuery()
.variableNameLike("approval%")
.list();
3.2 性能优化建议
- 历史数据归档策略:
xml复制<property name="history" value="audit"/>
<!-- 可选值:none/activity/audit/full -->
- 定时清理历史数据:
sql复制-- 保留最近30天的历史数据
DELETE FROM ACT_HI_ACTINST
WHERE END_TIME_ < DATE_SUB(NOW(), INTERVAL 30 DAY);
4. 异常排查手册
4.1 死锁检测
当流程"卡住"时检查:
sql复制SELECT * FROM ACT_RU_EXECUTION
WHERE IS_ACTIVE_ = 1 AND SUSPENSION_STATE_ = 1
AND PROC_INST_ID_ NOT IN (
SELECT PROC_INST_ID_ FROM ACT_RU_TASK
);
4.2 变量类型冲突
常见错误:将Long型变量用Integer读取
java复制// 正确做法
Long value = (Long) runtimeService.getVariable(executionId, "count");
5. 与Flowable的对比
作为Activiti的分支,Flowable的表结构基本兼容但有所优化:
- 增加了ACT_FO_*前缀的表
- 历史表增加了更多索引
- 运行时表增加了事务锁机制
理解这些表结构后,下次当流程出现异常时,你可以直接查询数据库定位问题根源,而不是盲目地重启服务。我在金融项目中最深的一次教训是:一个未清理的ACT_RU_TASK记录导致流程版本升级失败,浪费了团队两天时间。
