流程部署完成后,每启动一次流程就是一个流程实例。
(一)根据流程定义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