【Flowable】核心概念、核心表字段、关联关系以及生命周期
Flowable 是一个轻量级的工作流和业务流程管理(BPM)平台,基于 Activiti 项目发展而来。
本文详细讲解 Flowable 的核心概念、核心表字段、关联关系以及生命周期。
Flowable 核心概念
1. 流程定义 (Process Definition)
- 流程定义是 BPMN 2.0 XML 文件的部署结果
- 它描述了业务流程的结构和行为
- 每个流程定义都有一个唯一的 key 和版本号
2. 流程实例 (Process Instance)
- 流程实例是流程定义的一次具体执行
- 每启动一次流程就会创建一个流程实例
- 一个流程定义可以有多个流程实例
3. 执行 (Execution)
- 执行代表流程实例当前活动的位置
- 在简单流程中,执行与流程实例是一对一关系
- 在并行流程中,一个流程实例可能有多个执行
4. 任务 (Task)
- 人工任务需要用户参与处理
- 系统任务由系统自动执行
- 用户任务是任务的一种特殊类型
5. 身份管理 (Identity Management)
- 用户 (User) 和组 (Group) 管理
- 任务分配和权限控制
Flowable 核心表结构
1. Repository 表 (ACT_RE_*)
ACT_RE_PROCDEF (流程定义表)
ID_
: 流程定义唯一标识符KEY_
: 流程定义 KeyVERSION_
: 版本号NAME_
: 流程定义名称DEPLOYMENT_ID_
: 部署ID,关联 ACT_RE_DEPLOYMENTRESOURCE_NAME_
: BPMN 文件名DGRM_RESOURCE_NAME_
: 流程图文件名
ACT_RE_DEPLOYMENT (部署表)
ID_
: 部署IDNAME_
: 部署名称DEPLOY_TIME_
: 部署时间
2. Runtime 表 (ACT_RU_*)
ACT_RU_EXECUTION (执行表)
ID_
: 执行IDPROC_INST_ID_
: 流程实例IDPROC_DEF_ID_
: 流程定义IDACT_ID_
: 当前活动IDIS_ACTIVE_
: 是否活跃IS_CONCURRENT_
: 是否并行PARENT_ID_
: 父执行ID
ACT_RU_TASK (任务表)
ID_
: 任务IDEXECUTION_ID_
: 执行IDPROC_INST_ID_
: 流程实例IDPROC_DEF_ID_
: 流程定义IDNAME_
: 任务名称ASSIGNEE_
: 任务处理人CREATE_TIME_
: 创建时间TASK_DEF_KEY_
: 任务定义Key
ACT_RU_VARIABLE (变量表)
ID_
: 变量IDPROC_INST_ID_
: 流程实例IDEXECUTION_ID_
: 执行IDTASK_ID_
: 任务IDNAME_
: 变量名TYPE_
: 变量类型TEXT_
: 变量值
ACT_RU_IDENTITYLINK (身份链接表)
ID_
: 链接IDUSER_ID_
: 用户IDGROUP_ID_
: 组IDTASK_ID_
: 任务IDPROC_INST_ID_
: 流程实例IDTYPE_
: 链接类型(candidate/assignee/owner)
3. History 表 (ACT_HI_*)
ACT_HI_PROCINST (历史流程实例表)
ID_
: 流程实例IDPROC_DEF_ID_
: 流程定义IDSTART_TIME_
: 开始时间END_TIME_
: 结束时间DURATION_
: 持续时间START_USER_ID_
: 发起人IDSTART_ACT_ID_
: 开始活动IDEND_ACT_ID_
: 结束活动ID
ACT_HI_ACTINST (历史活动实例表)
ID_
: 活动实例IDPROC_DEF_ID_
: 流程定义IDPROC_INST_ID_
: 流程实例IDEXECUTION_ID_
: 执行IDACT_ID_
: 活动IDACT_NAME_
: 活动名称ACT_TYPE_
: 活动类型START_TIME_
: 开始时间END_TIME_
: 结束时间DURATION_
: 持续时间
ACT_HI_TASKINST (历史任务实例表)
ID_
: 任务实例IDPROC_DEF_ID_
: 流程定义IDTASK_DEF_KEY_
: 任务定义KeyPROC_INST_ID_
: 流程实例IDEXECUTION_ID_
: 执行IDNAME_
: 任务名称ASSIGNEE_
: 任务处理人START_TIME_
: 开始时间END_TIME_
: 结束时间DURATION_
: 持续时间
ACT_HI_VARINST (历史变量实例表)
ID_
: 变量实例IDPROC_INST_ID_
: 流程实例IDEXECUTION_ID_
: 执行IDTASK_ID_
: 任务IDNAME_
: 变量名VAR_TYPE_
: 变量类型TEXT_
: 变量值
核心表关联关系
1. 流程定义与部署关系
ACT_RE_PROCDEF.DEPLOYMENT_ID_ → ACT_RE_DEPLOYMENT.ID_
2. 流程实例与流程定义关系
ACT_RU_EXECUTION.PROC_DEF_ID_ → ACT_RE_PROCDEF.ID_
ACT_HI_PROCINST.PROC_DEF_ID_ → ACT_RE_PROCDEF.ID_
3. 执行与流程实例关系
ACT_RU_EXECUTION.PROC_INST_ID_ → ACT_RU_EXECUTION.ID_ (根执行)
4. 任务与执行关系
ACT_RU_TASK.EXECUTION_ID_ → ACT_RU_EXECUTION.ID_
ACT_RU_TASK.PROC_INST_ID_ → ACT_RU_EXECUTION.PROC_INST_ID_
5. 变量与执行/任务关系
ACT_RU_VARIABLE.EXECUTION_ID_ → ACT_RU_EXECUTION.ID_
ACT_RU_VARIABLE.TASK_ID_ → ACT_RU_TASK.ID_
ACT_RU_VARIABLE.PROC_INST_ID_ → ACT_RU_EXECUTION.PROC_INST_ID_
6. 身份链接与任务/流程实例关系
ACT_RU_IDENTITYLINK.TASK_ID_ → ACT_RU_TASK.ID_
ACT_RU_IDENTITYLINK.PROC_INST_ID_ → ACT_RU_EXECUTION.PROC_INST_ID_
Flowable 生命周期详解
1. 部署阶段 (Deployment)
// 部署流程定义
Deployment deployment = repositoryService.createDeployment().addClasspathResource("processes/my-process.bpmn20.xml").name("My Process Deployment").deploy();// 结果:
// 1. ACT_RE_DEPLOYMENT 插入部署记录
// 2. ACT_RE_PROCDEF 插入流程定义记录
2. 启动流程实例 (Start Process Instance)
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcessKey");// 结果:
// 1. ACT_RU_EXECUTION 插入执行记录
// 2. ACT_HI_PROCINST 插入历史流程实例记录
// 3. ACT_RU_VARIABLE 插入流程变量
// 4. ACT_HI_ACTINST 记录开始活动
3. 任务处理阶段 (Task Processing)
// 查询任务
List<Task> tasks = taskService.createTaskQuery().taskAssignee("user1").list();// 完成任务
taskService.complete(task.getId());// 结果:
// 1. ACT_RU_TASK 删除已完成任务
// 2. ACT_HI_TASKINST 插入历史任务记录
// 3. ACT_RU_EXECUTION 更新执行状态
// 4. ACT_HI_ACTINST 记录活动历史
4. 流程执行 (Process Execution)
// 设置流程变量
runtimeService.setVariable(processInstanceId, "variableName", "value");// 触发信号事件
runtimeService.signalEventReceived("signalName");// 结果:
// 1. ACT_RU_VARIABLE 更新变量值
// 2. ACT_HI_VARINST 记录变量历史
5. 流程结束 (Process Completion)
// 正常结束或通过结束事件结束
// 结果:
// 1. ACT_RU_EXECUTION 删除执行记录
// 2. ACT_RU_TASK 删除任务记录
// 3. ACT_RU_VARIABLE 删除运行时变量
// 4. ACT_HI_PROCINST 更新结束时间
// 5. ACT_HI_ACTINST 记录结束活动
6. 流程异常处理
// 挂起流程实例
runtimeService.suspendProcessInstanceById(processInstanceId);// 激活流程实例
runtimeService.activateProcessInstanceById(processInstanceId);// 删除流程实例
runtimeService.deleteProcessInstance(processInstanceId, "reason");
生命周期中的关键转换
1. 运行时表到历史表的转换
- 当任务完成时,ACT_RU_TASK → ACT_HI_TASKINST
- 当流程实例结束时,ACT_RU_EXECUTION → ACT_HI_PROCINST
- 当变量更新时,ACT_RU_VARIABLE → ACT_HI_VARINST
2. 并行执行管理
- 并行网关会产生多个执行实例
- 每个执行实例在 ACT_RU_EXECUTION 中有独立记录
- 并行汇聚时会合并执行实例
3. 多实例任务处理
- 多实例任务会产生多个任务实例
- 每个实例在 ACT_RU_TASK 中有独立记录
- 完成所有实例后继续流程执行
实际应用示例
在你的项目中,这些概念和表结构体现在:
-
流程启动:
// 设置认证用户 identityService.setAuthenticatedUserId(userIdStr); // 启动流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, formBusinessKey, variables);
-
任务处理:
// 完成任务 taskService.complete(taskBo.getTaskId(), taskBo.getVariables(), localScope);
-
历史查询:
// 查询历史流程实例 HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).includeProcessVariables().singleResult();
理解这些核心概念、表结构和生命周期,可以更好地设计和优化基于 Flowable 的工作流应用。