流程定义与流程实例
流程定义 ProcessDefinition 和流程实例 ProcessInstance是Activiti中非常重要的 两个概念。
他们的关系其实类似于JAVA中类和对象的概念。
流程定义ProcessDefinition是以BPMN文件定义的一个工作流程,是一组工作规 范。例如我们之前
定义的请假流程。流程实例ProcessInstance则是指一个具体的业 务流程。例如某个员工发起一次
请假,就会实例化一个请假的流程实例,并且每个 不同的流程实例之间是互不影响的。
在后台的表结构中,有很多张表都包含了流程定义ProcessDefinetion和流程实例 ProcessInstance
的字段。流程定义的字段通常是PROC_DEF_ID,而流程实例的字 段通常是PROC_INST_ID。
添加Businesskey
全部代码:
package com.nanjing;
import org.activiti.engine.*;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
/**
* @author :楼兰
* @date :Created in 2021/4/8
* @description:
**/
public class ActivitiBusinessDemo {
/**
* 添加业务key 到Activiti的表
*/
@Test
public void addBusinessKey(){
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、启动流程的过程中,添加businesskey
// 第一个参数:流程定义的key
// 第二个参数:businessKey,存出差申请单的id,就是1001
ProcessInstance instance = runtimeService.
startProcessInstanceByKey("myleave", "1001");
// 4、输出
System.out.println("businessKey=="+instance.getBusinessKey());
}
/**
* 全部流程实例的 挂起和 激活
* suspend 暂停
*/
@Test
public void suspendAllProcessInstance(){
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取Repositoryservice
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、查询流程定义,获取流程定义的查询对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myleave")
.singleResult();
// 4、获取当前流程定义的实例是否都是挂起状态
boolean suspended = processDefinition.isSuspended();
// 5、获取流程定义的id
String definitionId = processDefinition.getId();
// 6、如果是挂起状态,改为激活状态
if(suspended){
// 如果是挂起,可以执行激活的操作,参数1:流程定义id 参数2:是否激活,参数3:激活时间
repositoryService.activateProcessDefinitionById(definitionId,
true,
null);
System.out.println("流程定义id:"+definitionId+",已激活");
}else {
// 7、如果是激活状态,改为挂起状态,参数1:流程定义id 参数2:是否暂停 参数3 :暂停的时间
repositoryService.suspendProcessDefinitionById(definitionId,
true,
null);
System.out.println("流程定义id:"+definitionId+",已挂起");
}
}
/**
* 挂起、激活单个流程实例
*/
@Test
public void suspendSingleProcessInstance(){
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、通过RuntimeService获取流程实例对象
ProcessInstance instance = runtimeService.createProcessInstanceQuery()
.processInstanceId("2501")
.singleResult();
// 4、得到当前流程实例的暂停状态,true-已暂停 false -激活
boolean suspended = instance.isSuspended();
// 5、获取流程实例id
String instanceId = instance.getId();
// 6、判断是否已经暂停,如果已经暂停,就执行激活操作
if(suspended){
// 如果已经暂停,就执行激活
runtimeService.activateProcessInstanceById(instanceId);
System.out.println("流程实例id:"+instanceId+"已经激活");
}else {
// 7、如果是激活状态,就执行暂停操作
runtimeService.suspendProcessInstanceById(instanceId);
System.out.println("流程实例id:"+instanceId+"已经暂停");
}
}
/**
* 完成个人任务
*/
@Test
public void completTask(){
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取TaskService
TaskService taskService = processEngine.getTaskService();
// 3、使用taskservice获取任务,参数 流程实例的id,负责人
Task task = taskService.createTaskQuery()
.processInstanceId("10001")
.taskAssignee("leader")
.singleResult();
System.out.println("流程实例id=="+task.getProcessInstanceId());
System.out.println("流程任务id=="+task.getId());
System.out.println("负责人=="+task.getAssignee());
System.out.println("任务名称=="+task.getName());
// 4、根据任务的id完成任务
taskService.complete(task.getId());
}
}
挂起、激活流程实例
另一种方式是将某一个具体的流程实例挂起。例如对某一个有问题的请假申请进
行挂起操作,数据调整完成后再进行激活。继续执行挂起状态的流程将会抛出异常
测试完成个人任务