activiti 7 + springboot2(七) Activiti流程实例的运行过程
流程部署完成后,每启动一次流程就是一个流程实例。
(一)根据流程定义key启动流程实例
ProcessInstance processInstance = runtimeServic.startProcessInstanceByKey("myProcess_1");
每个执行是单独的流程实例,不同的实例之间不会相互干扰。
在任务节点表ACT_RU_TASK生成任务实例数据。
(二)启动流程实例的时候指定businesskey(业务标识)
//第一个参数:是指流程定义key //第二个参数:业务标识businessKey ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", "sn001");
businesskey:业务标识,业务标识来源于业务系统。通常为业务表的主键,根据业务标识来关联查询业务系统的数据。
启动流程实例时,指定的businesskey,就会在ACT_RU_EXECUTION #流程实例的执行表中存储businesskey
(三)查询流程实例
可以查看流程实例的状态,当前运行结点等信息。
/** * 查询指定流程的所有实例 */ @Test public void processInstanceQuery() { String processDefinitionKey = "myProcess_1"; List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).list(); for (ProcessInstance instance : list) { System.out.println("流程实例id: " + instance.getProcessInstanceId()); System.out.println("所属流程定义id: " + instance.getProcessDefinitionId()); System.out.println("是否执行完成: " + instance.isEnded()); System.out.println("是否暂停: " + instance.isSuspended()); System.out.println(" 当 前 活 动 标 识 : " + instance.getActivityId()); } }
(四)删除已经部署成功的流程
/** * 删除已经部署的流程定义 * delete from ACT_RE_DEPLOYMENT 流程部署信息表; * ACT_RE_PROCDEF 流程定义数据表; * ACT_GE_BYTEARRAY 二进制数据表; */ @Test public void deleteProcessDefinition(){ //执行删除流程定义 参数代表流程部署的id repositoryService.deleteDeployment("b10a151b-3366-11ea-bc18-30b49ec7161f"); }
1.当我们正在执行的这一套流程没有完全审批结束的时候,此时如果要删除流程定义信息就会失败。
2.如果要求强制删除,可以使用repositoryService.deleteDeployment("myProcess_1:1:f482ce07-35bf-11ea-b325-30b49ec7161f",true);
参数true代表级联删除,此时就会先删除没有完成的流程结点,最后就可以删除流程定义信息 false的值代表不级联
(五)删除流程实例
当前流程实例没有完全结束的时候,删除流程实例就会失败
/** * 删除流程实例 */ @Test public void deleteProcessInstance(){ String processInstanceId = "80a5703b-35c0-11ea-aa1a-30b49ec7161f"; //当前流程实例没有完全结束的时候,删除流程实例就会失败 runtimeService.deleteProcessInstance(processInstanceId,"删除原因"); }
执行删除部分SQL如下 :
1。 ACT_RU_TASK 运行时任务节点表
delete from ACT_RU_TASK where ID_ = ? and REV_ = ?
2。 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息
delete from ACT_RU_IDENTITYLINK where ID_ = ?
3。 ACT_RU_EXECUTION 运行时流程执行实例表
delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ?
执行更新部分SQL如下:
1。 ACT_HI_PROCINST 历史流程实例表
update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ? where ID_ = ?
2。 ACT_HI_ACTINST 历史节点表
update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_ = ?, DURATION_ = ? where ID_ = ?
3。 ACT_HI_TASKINST 历史任务实例表
update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?, PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?, CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?, TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where ID_ = ?
(六)操作流程挂起、激活
操作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停;
流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行。
/** * 操作流程的挂起、激活 */ @Test public void activateProcessDefinitionById(){ //查询流程定义对象 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").singleResult(); //当前流程定义的实例是否都为暂停状态 boolean suspended = processDefinition.isSuspended(); String processDefinitionId = processDefinition.getId(); if(suspended){ //挂起状态则激活 repositoryService.activateProcessDefinitionById(processDefinitionId,true,new Date()); System.out.println("流程定义:"+processDefinitionId+"激活"); }else{ //激活状态则挂起 repositoryService.suspendProcessDefinitionById(processDefinitionId,true,new Date()); System.out.println("流程定义:"+processDefinitionId+"挂起"); } }
(七)单个流程实例的挂起,激活
/** * 单个流程实例的挂起,激活 */ @Test public void activateProcessInstanceById(){ //查询流程实例对象 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("80a5703b-35c0-11ea-aa1a-30b49ec7161f").singleResult(); //当前流程定义的实例是否都为暂停状态 boolean suspended = processInstance.isSuspended(); String processInstanceId = processInstance.getId(); if(suspended){ //激活 runtimeService.activateProcessInstanceById(processInstanceId); System.out.println("流程:"+processInstanceId+"激活"); }else{ //挂起 runtimeService.suspendProcessInstanceById(processInstanceId); System.out.println("流程:"+processInstanceId+"挂起"); } }
(八)实例任务的执行
/** * 完成任务 */ @Test public void completeTask(){ //任务ID String taskId = "967465fe-3367-11ea-a057-30b49ec7161f"; taskService.complete(taskId); System.out.println("完成任务:任务ID:"+taskId); }
当流程实例的所有任务都终止后,流程实例也就结束了;
(九)设置流程实例的启动者
//设置当前用户id,启动流程会读取这个信息,对应processInstance.getStartUserId() Authentication.setAuthenticatedUserId(String.valueOf(user.getId()));
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(pd.getKey());
System.out.println("实例Id:"+processInstance.getId());
System.out.println("StartUserId:"+processInstance.getStartUserId());
打开act_hi_procinst表,看到该记录的START_USER_ID_字段记录了设置的用户id
源码下载 https://download.csdn.net/download/zsg88/12100238