文章目录
1. 说明
本文参考immort.Liu的博文。
2. Activiti7 各阶段数据库表的变化
2.1 流程的部署阶段
2.1.1 代码
/**
* 部署流程
*/
@Test
public void testDeployProcess() {
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("processes/test.bpmn")
.addClasspathResource("processes/test.png")
.name("测试数据库内容变化-1")
.deploy();
System.out.println("流程部署ID:"+deploy.getId());
System.out.println("流程部署名称:"+deploy.getName());
}
2.1.2 发生变化的表
部署阶段发生变化的表有:
act_ge_bytearray (资源表)
act_re_deployment (流程定义部署表,存储流程部署信息)
act_re_procdef (流程定义表,记录流程定义信息)
2.1.3 表内数据的内容
act_ge_bytearray
-
第一行存储的是bpmn的xml文件
-
第二行存储的是png图片文件
-
act_re_deployment
上图解释了这些数据的来源,也可以在部署的时候对表中其他字段进行设置。 -
act_re_procdef
以上表中key字段可以用来启动流程,本文就是用key启动流程。
2.2 启动流程实例
2.2.1 代码
/**
* 启动流程
*/
@Test
public void testStartProcess(){
securityUtil.logInAs("salaboy");
//启动流程实例,同时还要指定业务标识businessKey
//第一个参数:是指流程定义key
//第二个参数:业务标识businessKey
ProcessInstance test = runtimeService.startProcessInstanceByKey("test","1001");
System.out.println("流程实例id:"+test.getId());
System.out.println("流程部署id:"+test.getProcessDefinitionId());
}
2.2.2 发生变化的表
act_hi_actinst
act_hi_identitylink
act_hi_procinst
act_hi_taskinst
act_ru_execution
act_ru_identitylink
act_ru_task
说明:一般 act_hi_ 开头的表,在流程实例运行结束之后,其内的记录也不会删除。
2.2.3 表内数据的内容
act_hi_actinst
英文全拼: activiti_history_action_instance
翻译过来:activiti_历史_活动_实例
活动实例: 我个人认为就是流程中的一个节点,比如 采购申请
说明: 每处理一个任务(活动实例),表内则会增加一条记录。
act_hi_identitylink
英文全拼: activiti_history_identity_link
翻译过来:activiti_历史_身份_联系
里面记录了,每一个 流程实例的任务参与人 的历史信息(每参与一个,就记录一个)。
act_hi_procinst
英文全拼: activiti_history_process_instence
翻译过来:activiti_历史_流程_实例
说明: 每启动一个流程,就会产生一个流程实例。表中就多一条信息。
act_hi_taskinst
英文全拼: activiti_history_task_instence
翻译过来:activiti_历史_任务_实例
表内记录了每次执行过的(包括待执行的) 任务实例
act_ru_execution
英文全拼: activiti_run_execution
翻译过来: activiti_运行_执行
表内存储的数据结构是一个树形的结构,也就是表内有一个parent字段。
说明: 流程实例执行,如果当前只有一个分支时,一个流程实例只有一条记录且执行表的主键id和流程实例id相同,如果当前有多个分支正在运行则该执行表中有多条记录,存在执行表的主键和流程实例id不相同的记录。不论当前有几个分支总会有一条记录的执行表的主键和流程实例id相同 一个流程实例运行完成,此表中与流程实例相关的记录删除。
act_ru_identitylink
英文全拼: activiti_run_identity_link
翻译过来: activiti_执行_身份_链接
说明: 存储了未结束的流程实例中的参与人,如果有一个流程实例有两个参与人 zhangsan 和 lisi,当等待zhangsan执行的时候,此流程实例只拥有一条记录。当shangsan执行完成,轮到lisi执行的时候,那么此流程实例拥有了两条记录,当此流程实例执行完成时,此表内,关于执行完成的流程实例中所对应的所有的参与人则会被删除,但是act_hi_identitylink
表内不会删除,大家看表名也能理解。
act_ru_task
英文全拼: activiti_run_task
翻译过来: activiti_执行_任务
说明: 表内存储了未结束的流程实例中的待处理的任务(待处理的节点)。 一般情况下来说,每一个流程实例,在表内只有一条记录。
2.3 任务处理
2.3.1 代码
/**
* 查询及完成任务
*/
@Test
public void testTaskProcess(){
List<Task> list = taskService.createTaskQuery()
.taskAssignee("user1")
.list();
for (Task task : list) {
System.out.println("任务id:"+task.getId());
System.out.println("任务处理人:"+task.getAssignee());
System.out.println("流程实例id:"+task.getProcessInstanceId());
//完成任务
taskService.complete(task.getId());
}
}
2.3.2 发生变化的表
act_hi_actinst
act_hi_identitylink
act_hi_taskinst
act_ru_execution
act_ru_identitylink
act_ru_task
说明:一般 act_hi_ 开头的表,在流程实例运行结束之后,其内的记录也不会删除。
2.3.3 表内数据的变化
表的具体变化,可与2.2.3 节中的表进行比较。
act_hi_actinst
英文全拼: activiti_history_action_instance
翻译过来: activiti_历史_活动_实例
活动实例: 我个人认为就是流程中的一个节点,比如 采购申请
每处理一个任务(活动实例),表内则会增加一条记录。
表内的变化: 经过一次任务的处理,此表增加了一条记录。因为处理了一个任务。
act_hi_identitylink
英文全拼: activiti_history_identity_link
翻译过来: activiti_历史_身份_联系
里面记录了,每一个 流程实例的任务参与人 的历史信息(每参与一个,就记录一个)。
表内的变化: 表内添加了一条记录。原因是,此时等待lisi处理一个任务。多出了一个身份。
act_hi_taskinst
英文全拼: activiti_history_task_instence
翻译过来: activiti_历史_任务_实例
表内记录了每次执行过的(包括待执行的) 任务实例
表内的变化: 表内增加了一条记录,原因是处理完成了一个任务实例,现在又该处理第二个任务实例。所以多出来了一条记录。
act_ru_execution
英文全拼: activiti_run_execution
翻译过来: activiti_执行_执行
注意: 表内存储的数据结构是一个树形的结构,也就是表内有一个parent字段。
说明: 流程实例执行,如果当前只有一个分支时,一个流程实例只有一条记录且执行表的主键id和流程实例id相同,如果当前有多个分支正在运行则该执行表中有多条记录,存在执行表的主键和流程实例id不相同的记录。不论当前有几个分支总会有一条记录的执行表的主键和流程实例id相同 一个流程实例运行完成,此表中与流程实例相关的记录删除。
表内的变化: 表内对于该流程实例的第二条记录做了update,因为已经处理完成上一个任务实例,当前待处理的任务实例改变了,所以表内所对应的记录做了update(下图有更好的展示)
上面的记录为 任务处理之前的,后面的为任务处理之后的。
act_ru_identitylink
英文全拼: activiti_run_identity_link
翻译过来: activiti_执行_身份_链接
说明: 存储了未结束的流程实例中的参与人,如果有一个流程实例有两个参与人 zhangsan 和 lisi,当等待zhangsan执行的时候,此流程实例只拥有一条记录。当shangsan执行完成,轮到lisi执行的时候,那么此流程实例拥有了两条记录,当此流程实例执行完成时,此表内,关于执行完成的流程实例中所对应的所有的参与人则会被删除,但是act_hi_identitylink
表内不会删除,大家看表名也能理解。
表内的变化: 增加了一条记录。
act_ru_task
英文全拼: activiti_run_task
翻译过来: activiti_执行_任务
说明: 表内存储了未结束的流程实例中的待处理的任务(待处理的节点)。 一般情况下来说,每一个流程实例,在表内只有一条记录。
表内的变化: 表内更新了对应此流程实例的记录。总是展示当前需要处理的任务实例。
2.4 流程结束
当处理完成所有的任务之后,流程结束。
2.4.1 代码
/**
* 查询及完成任务
*/
@Test
public void testTaskProcess(){
List<Task> list = taskService.createTaskQuery()
.taskAssignee("user2")
.list();
for (Task task : list) {
System.out.println("任务id:"+task.getId());
System.out.println("任务处理人:"+task.getAssignee());
System.out.println("流程实例id:"+task.getProcessInstanceId());
//完成任务
taskService.complete(task.getId());
}
}
2.4.2 发生变化的表
与2.3节的表相同
act_hi_actinst
act_hi_identitylink
act_hi_taskinst
act_ru_execution
act_ru_identitylink
act_ru_task
说明:一般 act_hi_ 开头的表,在流程实例运行结束之后,其内的记录也不会删除。
2.4.3 表内数据变化
act_hi_actinst
英文全拼: activiti_history_action_instance
翻译过来: activiti_历史_活动_实例
活动实例: 我个人认为就是流程中的一个节点,比如 采购申请
每处理一个任务(活动实例),表内则会增加一条记录。
表内的变化: 经过任务的处理,此表增加了记录。因为处理了任务。
act_hi_identitylink
英文全拼: activiti_history_identity_link
翻译过来:activiti_历史_身份_联系
里面记录了,每一个 流程实例的任务参与人 的历史信息(每参与一个,就记录一个)。
表内的变化: 表内添加了记录。原因是,流程实例已经运行完成。所以处理了很多任务实例。所以表内多了很多条记录。
act_hi_taskinst
英文全拼: activiti_history_task_instence
翻译过来: activiti_历史_任务_实例
表内记录了每次执行过的(包括待执行的) 任务实例
表内的变化: 表内增加了记录,流程实例已经运行完成。所以处理了很多任务实例。所以表内多了很多条记录。
act_ru_execution
英文全拼: activiti_run_execution
翻译过来: activiti_执行_执行
注意: 表内存储的数据结构是一个树形的结构,也就是表内有一个parent字段。
说明: 流程实例执行,如果当前只有一个分支时,一个流程实例只有一条记录且执行表的主键id和流程实例id相同,如果当前有多个分支正在运行则该执行表中有多条记录,存在执行表的主键和流程实例id不相同的记录。不论当前有几个分支总会有一条记录的执行表的主键和流程实例id相同 一个流程实例运行完成,此表中与流程实例相关的记录删除。
表内的变化: 表内为空。因为所有的流程实例都已经执行完成。所以并没有正在执行着的流程实例。
act_ru_identitylink
英文全拼: activiti_run_identity_link
翻译过来: activiti_执行_身份_链接
说明: 存储了未结束的流程实例中的参与人,如果有一个流程实例有两个参与人 zhangsan 和 lisi,当等待zhangsan执行的时候,此流程实例只拥有一条记录。当shangsan执行完成,轮到lisi执行的时候,那么此流程实例拥有了两条记录,当此流程实例执行完成时,此表内,关于执行完成的流程实例中所对应的所有的参与人则会被删除,但是act_hi_identitylink
表内不会删除,大家看表名也能理解。
表内的变化:表内为空。因为所有的流程实例都已经执行完成。所以并没有正在执行着的流程实例。
act_ru_task
英文全拼: activiti_run_task
翻译过来: activiti_执行_任务
说明: 表内存储了未结束的流程实例中的待处理的任务(待处理的节点)。 一般情况下来说,每一个流程实例,在表内只有一条记录。
表内的变化: 表内为空。因为所有的流程实例都已经执行完成。所以并没有正在执行着的流程实例。
3. 总结
经过以上细致的流程跟踪,一个简单的流程所涉及到的表,以及表中内容从开始到结束的变化都体现出来了,测试到此结束。