flowable工作流相关操作都是操作存储在对应表结构中,为了能更好弄清楚Flowable的实现原理与细节,我们首先需要清楚Flowable相关表结构及其作用。
Flowable的表结构在初始化时会创建五类表结构,具体如下:
ACT_RE:"RE"表示repository。这个前缀的表包含流程定义和流程静态资源(图片、规则、等等).
ACT_RU:"RU"表示runtime。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。Flowable只在流程实例执行过程中保存这些数据在流程结束事就会删除这些记录。这样运行时表可以一直很小速度很快。
ACT_HI:"HI"表示history。这些表包含历史数据,比如历史流程实例,变量,任务等等。
ACT_GE: "GE"表示general。通用数据,用于不同场景下。
ACT_ID:"ID"表示identity(组织机构)。这些表包含标识信息,如用户,用户组等等。
具体的表结构含义:
表分类 | 表名 | 解释 |
---|---|---|
一般数据 | ||
ACT_GE_BYTEARRAY | 二进制数据表,存放流程定义、流程模板、流程图的字节文件流 | |
ACT_GE_PROPERTY | 系统相关属性,不常用 | |
流程历史记录 | ||
ACT_HI_ACTINST | 历史节点表,存储流程实例运转的各个节点信息,(包括开始、结束等非任务节点) | |
ACT_HI_ATTACHMENT | 历史流程附件表,存储历史节点上传的附件信息(不常用) | |
ACT_HI_COMMENT | 历史意见表 | |
ACT_HI_DETAIL | 历史的流程详情,存储节点运转的一些信息(不常用) | |
ACT_HI_IDENTITYLINK | 历史流程人员表,存储流程各个节点候选、办理人员信息,常用与查询某人或部门的已办任务 | |
ACT_HI_PROCINST | 历史的流程实例,存储流程实例历史数据(包含正在运行的流程实例) | |
ACT_HI_TASKINST | 历史流程任务表,存储历史任务节点 | |
ACT_HI_VARINST | 历史流程变量表,存储流程历史节点的变量信息 | |
流程定义表 | ||
ACT_RE_DEPLOYMENT | 部署单元信息,存储流程定义、模板部署信息 | |
ACT_RE_MODEL | 流程模板信息,存储流程模板相关描述信息 | |
ACT_RE_PROCDEF | 流程定义信息表,存储流程定义相关描述信息 | |
运行实例表 | ||
ACT_RU_EVENT_SUBSCR | 监听信息表,不常用 | |
ACT_RU_EXECUTION | 运行时流程执行实例表,记录运行中流程的各个分支信息(没有子流程时,其数据与ACT_RU_TASK表数据一一对应) | |
ACT_RU_IDENTITYLINK | 运行时流程人员表,重要,存储任务节点与参与者的相关信息,常用语查询人员或部门的待办任务时使用 | |
ACT_RU_JOB | 运行时定时任务数据表,存储流程的定时任务信息 | |
ACT_RU_TASK | 运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用语查询人员或部门的待办任务时使用 | |
ACT_RU_VARIABLE | 运行时流程变量数据表,存储运行中的流程各个节点的变量信息 | |
用户组表 | ||
ACT_ID_BYTEARRAY | 二进制数据表 | |
ACT_ID_GROUP | 用户组信息表,对应节点选定候选组信息 | |
ACT_ID_INFO | 用户扩展信息表,存储用户扩展信息 | |
ACT_ID_MEMBERSHIP | 用户与用户组关系表 | |
ACT_ID_PRIV | 权限表 | |
ACT_ID_PRIV_MAPPING | 用户或组权限关系表 | |
ACT_ID_PROPERTY | 属性表 | |
ACT_ID_TOKEN | 用户token信息 | |
ACT_ID_USER | 用户信息表,对应节点选定办理人或候选人信息 |
流程部署
部署资源表:ACT_GE_BYTEARRAY
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
REV_ | 版本号 | |
NAME_ | 名称 | 部署文件名称如:holiday.bpmn20.xml、holiday.bpmn20.png |
DEPLOYMENT_ID_ | 部署ID | |
BYTES_ | 字节(二进制) | |
GENERATED_ | 是否系统生成 | 0:用户上传;1:系统自动生成,如系统自动根据xml生成png |
部署ID表:ACT_RE_DEPLOYMENT
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
NAME_ | 名称 | |
CATEGORY_ | 分类 | |
TENANT_ID_ | 租户Id | |
DEPLOY_TIME_ | 部署时间 | |
DERIVED_FROM_ | 来源于 | |
DERIVED_FROM_ROOT_ | 来源于 | |
ENGINE_VERSION_ | 流程引擎版本 |
流程表:ACT_RE_PROCDEF
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
REV_ | 版本号 | |
CATEGORY_ | 分类 | 流程定义的namespace就是类别 |
NAME_ | 名称 | |
KEY_ | 标识 | |
VERSION_ | 版本 | |
DEPLOYMENT_ID_ | 部署ID | |
RESOURCE_NAME_ | 资源名称 | 流程bpmn文件名称 |
DGRM_RESOURCE_NAME_ | 图片资源名称 | |
DESCRIPTION_ | 描述 | |
HAS_START_FROM_KEY_ | 拥有开始表单标识 | start节点是否存在formkey,0:否1:是 |
HAS_GRAPHICAL_NOTATION | 拥有图形信息 | |
SUSPENSION_STATE_ | 挂起状态 | 暂停状态,1:激活;2:暂停 |
TENANT_ID_ | 租户id |
业务流程定义数据表与ACT_RE_DEPLOYMENT是多对一的关系,即一个部署的bar包可能包含多个流程定义文件,每个流程定义文件都会有一条记录在ACT_reprocdef表内,每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内的一个资源文件和png图片文件和ACT_GE_BYTEARRAY的关联是通过程序用ACT_GE_BYTEARRAY.NAME_与ACT_RE_PROCDEF.NAME_完成的。
流程挂起与激活
部署的流程默认状态为激活,若我们暂时不想使用该定义的流程,那么可以挂起该流程。当然该流程定义下边所有的流程实例全部暂停。
流程定义为挂起状态,该流程定义将不允许启动新的流程实例,同时该流程定义下的所有流程实例都将会全部挂起暂停执行。
具体实现其实就是更新了ACT_RU_TASK表中的SUSPENSION_STATE_字段,挂起时改为2,而且通过REV_字段来控制数据安全,也是乐观锁的体现,若需要启动一个已经挂起的流程就会报如下错误:
启动流程
当我们启动一个流程实例之后,会在ACT_RU_* 对应的表结构中操作,运行时涉及的表一共有十张:
ACT_RU_DEADLETTER_JOB 正在运行的任务表
ACT_RU_EVENT_SUBSCR 运行时事件
ACT_RU_EXECUTION 运行时流程执行实例
ACT_RU_HISTORY_JOB 历史作业表
ACT_RU_IDENTITYLINK 运行时用户关系信息
ACT_RU_JOB 运行时作业表
ACT_RU_SUSPENDED_JOB 暂停作业表
ACT_RU_TASK 运行时任务表
ACT_RU_TIMER_JOB 定时作业表
ACT_RU_VARIABLE 运行时变量表
启动一个实例时涉及到的表:
ACT_RU_EXECUTION 运行时流程执行实例
ACT_RU_IDENTITYLINK 运行时用户关系信息
ACT_RU_TASK 运行时任务表
ACT_RU_VARIABLE 运行时变量表
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
REV_ | 版本号 | |
PRO_INST_ID_ | 流程实例ID | |
BUSINESS_KEY_ | 业务主键ID | |
PARENT_ID_ | 父执行流的ID | |
PROC_DEF_ID_ | 流程定义的数据ID | |
SUPER_EXEC_ | ||
ROOT_PROC_INST_ID_ | 流程实例的root流程ID | |
ACT_ID_ | 节点实例ID | |
IS_ACTIVE_ | 是否存活 | |
IS_CONCURRENT_ | 执行流是否正在并行 | |
IS_SCOPE_ | ||
IS_EVENT_SCOPE_ | ||
IS_MI_ROOT_ | ||
SUSPENSION_STATE_ | 流程终端状态 | |
CACHED_ENT_SATE_ | ||
TENANT_ID_ | 租户编号 | |
NAME_ | ||
START_TIME_ | 开始时间 | |
START_USER_ID_ | 开始的用户编号 | |
LOCK_TIME_ | 锁定时间 | |
IS_COUNT_ENABLED | ||
EVT_SUBSCR_COUNT_ | ||
TASK_COUNT_ | ||
JOB_COUNT_ | ||
TIMER_JOB_COUNT_ | ||
SUSP_JOB_COUNT_ | ||
DEADLETTER_JOB_COUNT | ||
VAR_COUNT_ | ||
ID_LINK_COUNT_ |
ACT_RU_TASK 运行时任务表
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
REV_ | 版本号 | |
EXECUTION_ID_ | 任务所在的执行流ID | |
PROC_INST_ID_ | 流程实例ID | |
PROC_DEF_ID_ | 流程定义数据ID | |
NAME_ | 任务名称 | |
PARENT_TASK_ID_ | 父任务ID | |
DESCRIPTION_ | 说明 | |
TASK_DEF_KEY_ | 任务定义ID | |
OWNER_ | 任务拥有人 | |
ASSIGNEE_ | 被指派执行给任务的人 | |
DELEGATION_ | 委托人 | |
PRIORITY_ | 优先级 | |
CREATE_TIME_ | 创建时间 | |
DUE_DATE_ | 耗时 | |
CATEGORY_ | 类别 | |
SUSPENSION_STATE_ | 是否挂起 | 1:激活,2:挂起 |
TENANT_ID_ | 租户编号 | |
FORM_KEY_ | 表单key | |
CLAIM_TIME_ | 拾取时间 |
ACT_RU_VARIABLE 运行时变量表
字段 | 名称 | 备注 |
---|---|---|
iD_ | 主键 | |
REV_ | 版本号 | |
TYPE_ | 参数类型 | 可以是基本类型,也可以用户自行扩展 |
NAME_ | 参数名称 | |
EXECUTION_ID_ | 参数执行ID | |
PROC_INST_ID_ | 流程实例ID | |
TASK_ID_ | 任务ID | |
BYTEARRAY_ID_ | 资源ID | |
DOUBLE_ | 参数为double,则存入该字段中 | |
LONG_ | 参数为Long,则存入该字段中 | |
TEXT_ | 保存文本类型的参数值 | |
TEXT2_ | 保存文本类似性的参数值 |
ACT_RU_IDENTITYLINK 运行是用户关系信息
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
REV_ | 版本号 | |
GROUP_ID_ | 用户组ID | |
TYPE_ | 关系数据类型 | assignee支配人(组),candidate候选人(组),ower拥有人,participant参与者 |
USER_ID_ | 用户ID | |
TASK_ID_ | 任务ID | |
PROC_INST_ID_ | 流程实例ID | |
PROC_DEF_ID_ | 属性ID |
流程审批
正常流程处理过程中涉及到的表结构
ACT_RU_EXECUTION 运行时流程执行实例
ACT_RU_IDENTITYLINK 运行时用户关系信息
ACT_RU_TASK 运行时任务表
ACT_RU_VARIABLE 运行时变量表
详细的表字段信息上面已经描述了,这里不再赘述。
流程审批完成
一个流程审批完成后,这四张表的数据将会被清空:
ACT_RU_EXECUTION 运行时流程执行实例
ACT_RU_IDENTITYLINK 运行时用户关系信息
ACT_RU_TASK 运行时任务表
ACT_RU_VARIABLE 运行时变量表
因为最后一个审批节点已经审批完成此时这个这个流程就不属于运行中的流程了,所以这四张表中就没有这个流程的数据了。此时会将这个流程的相关数据记录到对应的历史表中
ACT_HI_ACTINST 历史流程实例
ACT_HI_ATTACHMENT 历史流程附件
ACT_HI_COMMENT 历史说明性信息
ACT_HI_DETAIL 历史流程运行中的细节信息
ACT_HI_IDENTITYLINK 历史流程运行过程中用户关系
ACT_HI_PROCINST 历史流程实例
ACT_HI_TASKINST 历史任务实例
ACT_HI_VARINST 历史流程运行中的变量信息
详细的表结构:
ACT_HI_ACTINST 历史流程实例
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
PROC_DEF_ID_ | 流程定义ID | |
PROC_INST_ID_ | 流程实例ID | |
EXECUTION_ID | 执行ID | |
ACT_ID_ | 节点实例ID | |
TASK_ID_ | 任务ID | |
CALL_PROC_INST_ID_ | 调用外部的流程实例ID | |
ACT_NAME_ | 节点名称 | |
ACT_TYPE_ | 节点类型 | |
ASSIGNEE_ | 处理人 | |
START_TIME | 开始时间 | |
END_TIME | 结束时间 | |
DURATION | 耗时 | |
DELETE_REASON_ | 删除原因 | |
TENANT_ID_ | 租户编号 |
ACT_HI_PROCINST 历史流程实例
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
PROC_INST_ID_ | 流程实例ID | |
BUSINESS_KEY_ | 业务主键 | |
PROC_DEF_ID_ | 属性ID | |
START_TIME_ | 开始时间 | |
END_TIME_ | 结束时间 | |
DURATION_ | 耗时 | |
START_USER_ID_ | 起始人 | |
START_ACT_ID_ | 起始节点 | |
END_ACT_ID_ | 结束节点 | |
SUPER_PROCESS_INSTANCE_ID_ | 父流程实例ID | |
DELETE_REASON_ | 删除原因 | |
TENANT_ID_ | 租户编号 | |
NAME_ | 名称 |
ACT_HI_INDENTITYLINK 历史流程运行过程中的用户关系
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
GROUP_ID_ | 组编号 | |
TYPE_ | 类型 | |
USER_ID_ | 用户编号 | |
TASK_ID_ | 任务编号 | |
CREATE_TIME_ | 创建时间 | |
PROC_INST_ID_ | 流程实例编号 | |
SCOPE_ID_ | ||
SCOPE_TYPE_ | ||
SCOPE_DEFINITION_ID_ |
ACT_HI_TASKINST 历史任务实例
字段 | 名称 | 备注 |
---|---|---|
ID_ | 主键 | |
PROC_DEF_ID_ | 流程定义ID | |
TASK_DEF_KEY_ | 任务定义ID | |
PROC_INST_ID_ | 流程实例ID | |
EXECUTION_ID_ | 执行ID | |
PARENT_TASK_ID_ | 父任务ID | |
NAME_ | 名称 | |
DESCRIPTION_ | 说明 | |
OWNER_ | 实际签收人任务的拥有者 | 签收人(默认为空,只有在委托时才有值) |
ASSIGNEE_ | 被指派执行该任务的人 | |
START_TIME_ | 开始时间 | |
CLAIM_TIME_ | 任务拾取时间 | |
END_TIME_ | 结束时间 | |
DURATION_ | 耗时 | |
DELETE_REASON_ | 删除原因 | |
PRIORITY_ | 优先级别 | |
DUE_DATE_ | 过期时间 | |
FORM_KEY_ | ||
CATEGORY_ | 优先级 | |
TENANT_ID_ | 租户编号 |