别再乱点按钮了!深入Flowable数据库,看懂流程挂起后ACT_RU_*表到底发生了什么变化

张开发
2026/4/12 16:53:34 15 分钟阅读

分享文章

别再乱点按钮了!深入Flowable数据库,看懂流程挂起后ACT_RU_*表到底发生了什么变化
深入Flowable数据库流程挂起时ACT_RU_*表的状态变迁全解析当你在Flowable控制台点击挂起按钮时系统背后究竟发生了什么本文将带你深入数据库层面通过逐表解析的方式还原流程挂起操作的全貌。不同于常规的功能性介绍我们将聚焦于运行时表ACT_RU_*中关键字段的变化规律让你真正掌握流程状态管理的底层逻辑。1. 流程挂起的数据库全景图流程挂起操作在数据库层面会产生连锁反应主要涉及以下核心表ACT_RU_EXECUTION运行时执行表ACT_RU_TASK运行时任务表ACT_RU_JOB运行时作业表ACT_RU_SUSPENDED_JOB挂起作业表这些表通过SUSPENSION_STATE_字段1激活2挂起和PROC_DEF_ID_/PROC_INST_ID_等关联字段形成完整的状态网络。挂起操作本质上就是将这些表中相关记录的状态值从1改为2并将作业记录迁移到专用表。提示所有运行时表都以ACT_RU_开头而历史表则以ACT_HI_开头。挂起操作只影响运行时表历史表数据保持不变。2. 执行表(ACT_RU_EXECUTION)的状态变迁执行表记录了流程实例的运行轨迹。当挂起流程实例时-- 典型的状态变更SQL实际由Flowable内部执行 UPDATE ACT_RU_EXECUTION SET SUSPENSION_STATE_ 2 WHERE PROC_INST_ID_ 流程实例ID;关键变化包括状态字段更新所有相关记录的SUSPENSION_STATE_从1变为2业务影响正在运行的流程实例立即暂停子执行流如并行分支同步挂起新启动的流程节点将被阻止对比状态示例字段激活状态值挂起状态值说明SUSPENSION_STATE_12核心状态标识IS_ACTIVE_10活动状态标识IS_SCOPE_11作用域标识不变3. 任务表(ACT_RU_TASK)的挂起机制用户任务在挂起时会表现出特殊行为前端表现任务列表显示为灰色尝试完成任务时抛出FlowableException: Cannot complete a suspended task数据库变化UPDATE ACT_RU_TASK SET SUSPENSION_STATE_ 2, IS_SUSPENDED_ 1 WHERE PROC_INST_ID_ 流程实例ID;特殊场景处理定时任务如边界定时器会继续显示但无法触发委派任务保持原有委托关系但不可操作多实例任务的每个实例都会同步挂起任务状态转换示意图[激活状态] │ ▼ [挂起操作] │ ▼ [挂起状态]───┬──▶[前端禁用] ├──▶[API调用异常] └──▶[历史记录保持]4. 作业系统的挂起处理逻辑Flowable的作业系统处理最为复杂涉及多表协作4.1 定时器作业迁移// 伪代码展示作业迁移逻辑 ListJob jobs jobManager.findJobsByProcessInstanceId(processInstanceId); for (Job job : jobs) { if (job instanceof TimerJobEntity) { jobManager.moveJobToSuspendedJobTable(job); } }迁移过程详解从ACT_RU_JOB表查询相关作业将作业记录插入ACT_RU_SUSPENDED_JOB表从原表删除记录更新作业服务的内部缓存4.2 异步作业处理异步作业的特殊之处在于正在执行的作业不会被中断已完成但未回调的作业会被挂起重试机制会暂停工作作业状态对照表作业类型原表位置挂起后位置恢复方式定时器ACT_RU_JOBACT_RU_SUSPENDED_JOB移回原表异步ACT_RU_JOBACT_RU_SUSPENDED_JOB移回原表暂停的定时器ACT_RU_TIMER_JOB保持不变继续暂停5. 挂起操作的完整事务边界Flowable通过严谨的事务管理确保状态一致性事务启动在RepositoryService调用suspendProcessDefinitionById时操作序列更新流程定义状态级联更新实例状态迁移作业记录更新缓存事务提交所有操作成功后一次性提交异常处理任一步骤失败则整体回滚典型的事务日志片段2023-08-20 14:30:45.123 DEBUG 开始挂起事务 2023-08-20 14:30:45.125 DEBUG 更新流程定义[procDefId:123]状态为挂起 2023-08-20 14:30:45.128 DEBUG 级联更新3个流程实例状态 2023-08-20 14:30:45.135 DEBUG 迁移5个作业到挂起表 2023-08-20 14:30:45.140 DEBUG 刷新执行缓存 2023-08-20 14:30:45.142 INFO 挂起事务成功提交6. 运维监控与问题排查掌握表结构变化有助于快速定位问题6.1 常见问题诊断挂起未生效-- 检查执行表状态 SELECT COUNT(*) FROM ACT_RU_EXECUTION WHERE PROC_INST_ID_ 实例ID AND SUSPENSION_STATE_ 1;作业未迁移-- 对比作业数量 SELECT (SELECT COUNT(*) FROM ACT_RU_JOB WHERE PROCESS_INSTANCE_ID_ 实例ID) as active_jobs, (SELECT COUNT(*) FROM ACT_RU_SUSPENDED_JOB WHERE PROCESS_INSTANCE_ID_ 实例ID) as suspended_jobs;6.2 监控指标建议指标名称监控SQL健康阈值挂起实例数SELECT COUNT(*) FROM ACT_RU_EXECUTION WHERE SUSPENSION_STATE_ 2 5%总量挂起作业积压SELECT COUNT(*) FROM ACT_RU_SUSPENDED_JOB 100状态不一致数SELECT COUNT(*) FROM ACT_RU_TASK WHERE IS_SUSPENDED_ ! CASE WHEN SUSPENSION_STATE_ 2 THEN 1 ELSE 0 END07. 深度优化建议基于数据库层面的实践技巧索引优化-- 为挂起查询添加复合索引 CREATE INDEX IDX_SUSPENSION_STATE_PROCINST ON ACT_RU_EXECUTION(SUSPENSION_STATE_, PROC_INST_ID_);批量操作优化// 优于单条SQL的批量操作方式 ListString instanceIds getInstancesToSuspend(); runtimeService.createUpdate(Execution.class) .set(suspensionState, 2) .where() .processInstanceIds(instanceIds) .execute();监控脚本示例#!/bin/bash # 监控挂起作业增长情况 SUSPENDED_JOBS$(mysql -uflowable -p密码 -e SELECT COUNT(*) FROM ACT_RU_SUSPENDED_JOB -s) if [ $SUSPENDED_JOBS -gt 500 ]; then echo 警告挂起作业数超过阈值 | mail -s Flowable监控警报 adminexample.com fi理解这些底层机制后下次当你在生产环境执行挂起操作时就能胸有成竹地预判系统行为快速定位异常状态真正成为Flowable流程管理的行家里手。

更多文章