介绍activiti中流程实例、任务、执行对象之间的区别联系,并且介绍这三者在流程运转过程中数据库中所对应表中数据的变化。将以请假流程为例进行说明
一、流程实例,任务,执行对象相关表结构
act_ru_execution 正在执行的执行对象表
act_hi_procinst 流程实例的历史表
act_ru_task 正在执行的任务表,(只有userTask任务节点,才会在此表中产生数据)
act_hi_taskinst 历史任务表,(只有userTask任务节点,才会在此表中产生数据)
act_hi_actinst 所有活动节点的历史表
二、请假流程实例进行说明
2.1、BPMN流程图
2.2 BPMN代码
<process id="leave" name="leave process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="组长审批" activiti:assignee="组长"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<userTask id="usertask2" name="主管审批" activiti:assignee="主管"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
2.3 运行流程进行说明
1 启动流程
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.startProcessInstanceByKey("leave");
启动流程之后 act_ru_execution、act_hi_procinst表中会各增加一条记录
从act_ru_execution中的ACT_ID_字段可以看出,当前执行节点在userTask1。
启动流程的同时,流程流向第一个用户任务节点,在act_ru_task,act_hi_taskinst各产生一条数据
从act_hi_taskinst中END_TIME_字段可以看出,此时userTask1节点正在执行。
2 组长审批任务
String taskId ="2505";
taskService.complete(taskId);
当组长审批完userTask1任务之后,当前流程流转到领导审批节点:
-
act_ru_task表数据变化
已经完成的userTask1任务节点数据被清除,新增一条userTask2节点数据
-
act_hi_taskinst表数据变化
已经完成的userTask1节点数据依然存在,其中END_TIME_字段为此任务节点结束时间、并且新增一条userTask2任务记录,其END_TIME_字段为NULL,表示此任务节点还在运行
-
act_ru_execution表数据变化
由于当前流程进行了运转,所以当前执行对象会更新当前流程执行了什么节点之上
3 领导审批任务
String taskId ="5002";
taskService.complete(taskId);
在此流程图中当领导进行审批之后,相当于走完了流程,也就意味着流程结束
act_ru_task表变化
同userTask1节点执行,当此任务节点执行结束之后就会从此表中删除这条节点记录act_hi_taskinst表数据变化
更新此任务节点记录,更新END_TIME_字段值为任务节点结束时间
4流程结束
act_ru_execution表数据变化
由于领导审批结束后,流程执行结束,也就是执行对象执行完毕,该条执行对象对应数据会被清除。-
act_hi_procinst表数据变化
流程执行结束,更新流程实例结束时间
三、总结
-
ProcessInstance流程实例
- 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个
- 代表流程定义的执行实例。一个流程实例包括了所有的运行节点
- 流程实例通常也可以叫做执行实例根节点
注意
(1)如果是单例流程,执行对象ID就是流程实例ID
(2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
(3)一个流程中,流程实例只有1个,执行对象可以存在多个。
-
Execution 执行对象
- 启动流程实例的时候会首先创建流程实例,然后创建执行实例
- 流程运转的过程中永远执行的是自己对应的执行实例
- 当所有的执行实例按照规则执行完毕之后,则实例随之结束
- 流程按流程定义的规则执行一次的过程,就可以表示执行对象Execution
- 一个流程中,执行对象可以存在多个,但是流程实例只能是一个
对应表:
act_ru_execution: 正在执行的信息
act_hi_procinst:已经执行完的历史流程实例信息
act_hi_actinst:存放历史所有完成的活动
-
Task任务 --- 执行到某任务环节时生成的任务信息。
对应的表:
act_ru_task:正在执行的任务信息
act_hi_taskinst:已经执行完的历史任务信息