要想了解activiti是如何工作的,数据流转肯定少不了的,这里并不会去分析流程定义、资源之类的表,因为那些表启动之后,基本上不怎么变化,我觉得应该重点关注是以下几个表:
(1)act_ru_execution,执行对象表(包含开始节点,任务节点,服务节点)
(2)act_ru_task,执行任务表(只包含userTask任务节点信息)
(3)act_hi_actinst,节点的执行历史(包含所有节点信息)
(4)act_hi_taskinst,任务执行的历史(只包含userTask任务节点信息)
下面以上篇文章 springBoot整合activiti6入门demo 中的请假流程为例进行简单说明
1.启动流程,其流程实例id为15001
(1)act_ru_execution会创建2条记录,其中一条是开始事件的执行实例(其PARENT_ID_为null),这个一直存在,只到流程结束后才会自动删除,另一条则是将要执行的节点,如下:
从表中数据可以看出,将要执行的节点id为writeApply,即填写请假申请
(2)act_ru_task会创建一条记录,即将要执行的任务(userTask才会创建)
(3)act_hi_actinst,和act_ru_execution一样,会创建两条记录:
虽然在历史表插入了两条记录,但它们并不是真正的历史记录,注意到字段END_TIME_为null,至于说,为什么END_TIME_为null就不是真正的历史,这是从它查询的sql看出来的,后面会讲。
(4)act_hi_taskinst,和act_ru_task一样,创建一条记录,同样其字段END_TIME_为null,并不是真正的历史记录
2. 提交请假申请
(1)act_ru_execution表更新将要执行的节点信息
可以看到,活动的id由writeApply变成了leaderApprove
(2)act_ru_task删除了执行完的任务,并插入一条待执行的任务
(3) act_hi_actinst更新了上一步插入的记录的END_TIME_字段,并插入两条记录,一条是排他性网关,一条则是待执行的任务leaderApprove
(4)act_hi_taskinst更新了上一步插入记录的END_TIME_字段,并插入一条待执行任务
3.领导审批,同意请假,流程结束
(1)流程结束,清除act_ru_execution表和act_ru_task表的记录
(2)act_hi_actinst更新了上一步插入的记录的END_TIME_字段,并插入两条记录,一条是排他性网关,一条则是结束节点
(3) act_hi_taskinst更新了上一步插入记录的END_TIME_字段
关于如何打印activiti的查询sql,在与springboot整合时,可添加如下日志配置:
logging.level.org.activiti.engine.impl.persistence.entity=trace