以下是Activiti7生成的25张表
看到刚才创建的表,我们发现Activiti 的表都以 ACT_ 开头。
第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对应。 ACT_RE :'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。 ACT_RU:'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 ACT_HI:'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。 ACT_GE : GE 表示 general。 通用数据, 用于不同场景下
表分类 | 表名 | 解释 |
---|---|---|
一般数据 | ||
[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_IDENTITYLINK] | 运行时用户关系信息,存储任务节点与参与者的相关信息 | |
[ACT_RU_JOB] | 运行时作业 | |
[ACT_RU_TASK] | 运行时任务 | |
[ACT_RU_VARIABLE] | 运行时变量表 |
流程部署,就是将bpmn文件,就是我们画好的流程图,保存到数据库里面;一共有25张表,那么会保存到哪几个表里面呢?
首先我们写代码,就是流程部署的代码,只要执行这个代码,我们的bpmn文件就可以保存到数据库了
/**
* 部署流程定义
*/
@Test
public void testDeployment(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、使用RepositoryService进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
.addClasspathResource("bpmn/evection.png") // 添加png资源
.name("出差申请流程")
.deploy();
// 4、输出部署信息
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
// 流程部署id:1
// 流程部署名称:出差申请流程
}
执行这个代码,会在控制台打印很多的东西,其中就有很多的sql语句,我们根据这些sql语句,就可以知道这段代码操作了哪些表;通过查看sql语句,分析得知,操作的表有:
这个表就是部署单元信息表; 我们根据表名可以看到是属于RE表,RE表是资源信息相关的表; 执行完以上的代码,我们看数据库这个表里面存的是什么?
相当于只存了两个字段,一个是当前流程的名称,一个数执行代码时间,也就是部署时间;部署时间是自动生成的,当前流程名称是从哪来的? 原来我们在执行代码的时候,已经自己定义了
这个表里面存的是已部署的流程定义;
GE表,里面存的是通用数据 这个表里面存的是通用的流程定义和流程资源
就是将我们的bpmn文件,png文件保存到数据库,这个表就是资源文件
这个表里面存放的是 系统相关属性数据,只要操作这个数据库,就会修改这个表
这个表不是部署的时候唯一操作的表
流程定义部署后操作activiti的3张表如下:
act_re_deployment 流程定义部署表,每部署一次增加一条记录
act_re_procdef 流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
act_ge_bytearray 流程资源表
注意:
act_re_deployment和act_re_procdef一对多关系,一次部署在流程部署表生成一条记录,但一次部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在act_ge_bytearray会存在两个资源记录,bpmn和png。
建议一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定义信息。
启动流程实例,就相当于张三创建出差申请;
相关的代码
/**
* 启动流程实例,相当于申请提交申请单
*/
@Test
public void testStartProcess(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、根据流程定义Id启动流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myJtxx");
// 输出内容
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("当前活动Id:" + processInstance.getActivityId());
//
// 流程定义id:myJtxx:1:4
// 流程实例id:2501
// 当前活动Id:null
}
以上代码执行完,输出的结果是
// 流程定义id:myJtxx:1:4
// 流程实例id:2501
// 当前活动Id:null
那么以上代码操作的数据库的表有哪几个?
这个是系统相关属性相关的 表,只要操作数据库,这个表里面的数据就会变化,就是对这个表进行更新操作
这个表里面存的是历史的流程实例;
张三刚创建一个申请单,这个表里面就只有两个数据;
创建出差申请的时候,开始标志出差申请已经完成,所以这个里面第一个数据有开始时间,有结束时间;
只是创建出差申请,所以第二个数据是没有结束时间的
以上这3个的字段值,是我们在bpmn里面定义的
历史的流程运行过程中用户关系 就是在走流程的时候,涉及到的人,都会保存在这个表里面;
历史的流程实例
历史的任务实例
一个节点可以认为是一个任务,每一个节点的创建都会在这个里面进行保存一条数据
运行时流程执行实例;
这个表里面主要记录的是当前已经执行到哪个节点了,把对应的节点对象记录到这个里面
运行时用户关系信息,存储任务节点与参与者的相关信息 也就是只要当前任务有参与者,就会将参与者的信息保存到这个表,多个人参与,保存多个信息
运行时任务
一个流程有多个节点,到某一个节点的时候,都会更新这个表,将当前节点的数据更新到这个表
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
也就是,某一个人登录系统,可以查看属于自己的节点,就是是否流程走到自己这里了;如果走到这里,就查询出来;
流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
那么当一个人获取数据,是要查询数据库里面的哪个表呢?
我们执行完查询的代码,看到控制台打印了查询日志
select distinct RES.*
FROM ACT_RU_TASK RES
INNER JOIN ACT_RE_PROCDEF D
ON RES.PROC_DEF_ID_ = D.ID_
WHERE RES.ASSIGNEE_ = 'zs' and D.KEY_ = 'myJtxx' order by RES.ID_ asc
LIMIT 2147483647 OFFSET 0;
我们分析这个sql语句, 查询了两个表,ACT_RU_TASK 和ACT_RE_PROCDEF表;
ACT_RU_TASK 运行时任务表,就是对于一个流程,已经走到哪个节点了,这个里面保存的就是当前正在走的节点的信息; ACT_RE_PROCDEF 已部署的流程定义表 ,就是部署流程的时候,创建的流程信息;
两个表联查,就可以查询到某一个用户,在某一个流程中,自己所需要处理的任务的list集合;
// 完成任务,
@Test
public void completTask(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取taskService
TaskService taskService = processEngine.getTaskService();
// 根据流程key 和 任务的负责人 查询任务
// 返回一个任务对象
Task task = taskService.createTaskQuery()
.processDefinitionKey("myJtxx") //流程Key
.taskAssignee("jing") //要查询的负责人
.singleResult();
// 完成任务,参数:任务id
taskService.complete(task.getId());
}
张三要提交申请单,就是要完成自己的任务,让其他人进行审核,张三完成任务的代码就是以上的代码;
ACT_RU_TASK 运行时任务表,就是对于一个流程,已经走到哪个节点了,这个里面保存的就是当前正在走的节点的信息;也就是保存的是当前正在执行的任务;
act_hi_taskinst 流程任务历史信息 已经执行完成的任务,都会保存在这个里面
**[ACT_HI_ACTINST]**历史的流程实例
**[ACT_HI_IDENTITYLINK]**历史的流程运行过程中用户关系
**[ACT_RU_EXECUTION]**运行时流程执行实例
**[ACT_RU_IDENTITYLINK]**运行时用户关系信息,存储任务节点与参与者的相关信息 这个是更新操作
一个流程实例走完了之后,关于运行的表,里面的数据都没有了
以下这些表都没有了
act_re_deployment 我们进行部署流程的 时候,会在ACT_RE_PROCDEF这个表里面存流程数据,所以现在只是查询这个表就可以将对应的流程查询出来
/**
* 查询流程定义
*/
@Test
public void queryProcessDefinition(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 得到ProcessDefinitionQuery 对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 查询出当前所有的流程定义
// 条件:processDefinitionKey =evection
// orderByProcessDefinitionVersion 按照版本排序
// desc倒叙
// list 返回集合
List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myJtxx")
.orderByProcessDefinitionVersion()
.desc()
.list();
// 输出流程定义信息
for (ProcessDefinition processDefinition : definitionList) {
System.out.println("流程定义 id="+processDefinition.getId());
System.out.println("流程定义 name="+processDefinition.getName());
System.out.println("流程定义 key="+processDefinition.getKey());
System.out.println("流程定义 Version="+processDefinition.getVersion());
System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
}
}
删除的代码是
public void deleteDeployment() {
// 流程部署id
String deploymentId = "1";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
//repositoryService.deleteDeployment(deploymentId, true);
}
执行完以上的代码,删除了哪些表?
和创建流程的表是一样的,就是这3个表; [ACT_RE_DEPLOYMENT] [ACT_RE_PROCDEF] [ACT_GE_BYTEARRAY]
历史记录里面的表是不会删除的