Flowable流程引擎架构与核心表结构解析

📅 2026/7/31 15:57:03
Flowable流程引擎架构与核心表结构解析
1. Flowable流程引擎的核心架构解析Flowable作为一款轻量级业务流程引擎其核心设计理念源于Activiti项目但在性能优化和架构设计上做了大量改进。整个引擎的核心可以概括为四大服务两大API的架构模式。运行时服务RuntimeService是流程执行的中枢神经系统。它负责处理所有运行中的流程实例包括启动流程、触发节点跳转、管理流程变量等核心操作。在实际项目中我们最常与之交互的就是这个服务。比如通过runtimeService.startProcessInstanceByKey()方法启动流程时引擎会在后台自动创建对应的执行流Execution和任务Task数据。历史服务HistoryService则像一台永不关机的记录仪。即使流程已经结束通过它仍然可以查询完整的流程轨迹。这个服务默认会记录所有流程活动的详细信息包括ACT_HI_PROCINST 表存储流程实例信息ACT_HI_TASKINST 表记录每个任务节点的操作历史ACT_HI_VARINST 表保存历史变量变更记录任务服务TaskService专注于人工任务处理。当流程到达UserTask节点时引擎会通过这个服务创建待办任务。开发中常用的complete()、claim()等API都来自此服务。特别要注意的是任务服务与身份服务IdentityService有紧密耦合因为每个任务都需要指定处理人。表单服务FormService提供了动态表单支持。虽然很多企业会选择自研表单系统但Flowable内置的表单引擎对于快速原型开发非常有用。它支持通过ACT_DE_FORM_*系列表存储表单定义和数据。管理服务ManagementService是运维人员的利器。通过它可以访问引擎的元数据、执行批处理作业甚至直接查询数据库表。但生产环境中要谨慎使用其API特别是涉及数据直接修改的操作。2. 核心流程表结构与关联关系2.1 运行时数据表群ACT_RU_开头的表存储所有运行时数据这些表的特点是数据量动态变化且会随着流程结束而被清理除非配置了历史级别保留。ACT_RU_EXECUTION表是运行时最核心的表之一。它采用树形结构记录流程实例和当前执行路径。每个流程实例会有一条根执行流而并行网关会产生多条子执行流。关键字段包括BUSINESS_KEY_业务系统关联键ACT_ID_当前活动IDSUSPENSION_STATE_挂起状态1活跃/2挂起ACT_RU_TASK表存储待办任务数据。其重要字段有ASSIGNEE_任务处理人CREATE_TIME_创建时间戳DUE_DATE_预期完成时间FORM_KEY_关联表单标识提示在高并发场景下ACT_RU_TASK表的查询性能至关重要。建议为ASSIGNEE_和CREATE_TIME_字段建立复合索引。ACT_RU_VARIABLE表管理流程变量。变量存储支持多种类型简单类型string/long/double/date序列化对象bytearray外键引用如关联业务实体ID2.2 历史数据表设计ACT_HI_系列表的设计考虑了审计和分析需求。以ACT_HI_PROCINST表为例除了基础信息外还包含START_USER_ID_流程发起人START_TIME_/END_TIME_生命周期时间戳DURATION_总耗时毫秒ACT_HI_ACTINST表记录了每个活动节点的详细轨迹包括ACTIVITY_ID_模型中的节点IDACTIVITY_NAME_节点名称ACTIVITY_TYPE_节点类型userTask/serviceTask等ASSIGNEE_任务处理人仅对UserTask有效2.3 身份与系统表ACT_ID_*表用于身份管理但在实际项目中大多数企业会将其与自有账号系统集成。常见的做法是通过IdentityService接口实现自定义的User和Group映射。ACT_GE_*表是通用数据表其中ACT_GE_BYTEARRAY存储了部署的流程定义文件BPMN/PNG等。这个表的NAME_字段会保存原始文件名而DEPLOYMENT_ID_关联到ACT_RE_DEPLOYMENT表。3. 流程定义与部署机制3.1 部署流程的底层操作当调用repositoryService.createDeployment()方法时引擎会执行以下原子操作在ACT_RE_DEPLOYMENT表插入部署记录将资源文件存入ACT_GE_BYTEARRAY表解析BPMN文件并在ACT_RE_PROCDEF表创建流程定义生成流程模型图并存储为PNG资源部署操作的典型代码示例Deployment deployment repositoryService.createDeployment() .addClasspathResource(processes/leave-approval.bpmn20.xml) .name(请假审批流程) .key(leaveApproval) .deploy();3.2 流程定义版本控制ACT_RE_PROCDEF表的版本管理策略值得特别关注KEY_字段是流程定义的逻辑标识VERSION_字段是自增版本号同一KEY_的多个版本可以共存DEPLOYMENT_ID_指向具体的部署包启动流程时如果不指定版本默认会使用最高版本。但生产环境中建议显式指定版本号避免因新部署导致意外行为。4. 流程实例运行原理4.1 启动过程的数据库事务当调用runtimeService.startProcessInstanceByKey()时在一个数据库事务内会向ACT_RU_EXECUTION插入根执行流记录在ACT_RU_TASK创建起始任务如果有将初始变量写入ACT_RU_VARIABLE在ACT_HI_PROCINST和ACT_HI_ACTINST添加历史记录4.2 节点跳转的持久化机制以UserTask为例完成任务时的数据变化当前任务在ACT_RU_TASK的状态更新为completed在ACT_HI_TASKINST记录完成时间和处理人根据流转条件创建新的执行流记录生成新的任务记录如果下一节点是UserTask4.3 异步执行的Job机制当遇到异步服务任务asynctrue时引擎会在ACT_RU_JOB表创建作业记录暂停当前执行流由JobExecutor异步执行完成后继续流程重要提示生产环境需要配置合适的线程池大小避免作业积压。同时要处理执行失败的重试逻辑。5. 实战中的表操作优化建议5.1 索引配置策略除了引擎自动创建的主键索引外建议根据查询模式添加-- 历史实例查询优化 CREATE INDEX IDX_HI_PRO_INST_END ON ACT_HI_PROCINST(END_TIME_); -- 任务查询优化 CREATE INDEX IDX_RU_TASK_ASSIGNEE ON ACT_RU_TASK(ASSIGNEE_); CREATE INDEX IDX_RU_TASK_CREATE ON ACT_RU_TASK(CREATE_TIME_);5.2 历史数据归档方案对于长期运行的系统可采用以下策略之一配置历史级别none/activity/audit/full定期将历史数据迁移到归档表使用ACT_EVT_LOG表记录精简事件5.3 监控关键表空间需要特别关注的表增长情况ACT_HI_ACTINST活动记录表增长最快ACT_HI_VARINST历史变量表大对象存储ACT_GE_BYTEARRAY资源存储表包含流程图片6. 与Spring Boot的深度整合实践6.1 自动配置的陷阱虽然starter能自动配置DataSource等组件但需要注意默认的H2内存数据库不适合生产环境自动执行的SQL脚本可能需要禁用事务管理器需要与业务系统协调6.2 多数据源处理方案当需要独立的数据源时配置示例Bean ConfigurationProperties(prefix flowable.datasource) public DataSource flowableDataSource() { return DataSourceBuilder.create().build(); } Bean public SpringProcessEngineConfiguration processEngineConfiguration() { SpringProcessEngineConfiguration config new SpringProcessEngineConfiguration(); config.setDataSource(flowableDataSource()); config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); return config; }6.3 自定义行为扩展通过监听器实现业务逻辑的例子public class CostApprovalListener implements TaskListener { Override public void notify(DelegateTask task) { if(task.getEventName().equals(EVENTNAME_CREATE)) { double amount (double) task.getVariable(costAmount); if(amount 10000) { task.setAssignee(financeDirector); } } } }在流程设计时引用userTask idapproveCost name审批费用 flowable:assignee${initiator} extensionElements flowable:taskListener eventcreate classcom.example.CostApprovalListener/ /extensionElements /userTask7. 常见问题排查指南7.1 流程无法启动的检查清单检查ACT_RE_PROCDEF表是否存在目标流程定义确认RESOURCE_NAME_字段匹配部署的BPMN文件验证SUSPENSION_STATE_是否为1活跃状态检查是否有违反流程启动条件的约束7.2 任务不显示的排查步骤查询ACT_RU_TASK表是否存在预期任务检查ASSIGNEE_或候选组设置是否正确确认任务的PROC_INST_ID_是否关联有效实例排查是否有权限过滤器拦截了任务查询7.3 变量丢失问题分析当发现流程变量异常时检查ACT_RU_VARIABLE和ACT_HI_VARINST表的变化记录确认变量作用域流程实例级/任务级排查是否有监听器或脚本修改了变量验证变量序列化/反序列化逻辑我在实际项目中最深刻的教训是对于关键业务变量一定要在流程启动时明确记录初始值并在每个任务节点记录变量快照。这为后续的审计和问题排查提供了重要依据。