目录
一,流程实例
1.1 什么是流程实例
参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例。是动态的。
流程定义和流程实例的图解:
1.2 启动流程实例
流程定义部署在 activiti 后,就可以在系统中通过 activiti 去管理该流程的执行,执行流程表示流 程的一次执行。比如部署系统请假流程后,如果某用户要申请请假这时就需要执行这个流程,如果 另外一个用户也要申请请假则也需要执行该流程,每个执行互不影响,每个执行是单独的流程实例。执行流程首先需要启动流程实例。
public class ActivitiStartInstance {
/**
* 启动流程定义的一个实例
*/
@Test
public void demo(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceById("myProcess_1:2:2504");
System.out.println("流程部署ID:"+processInstance.getDeploymentId());
System.out.println("流程实例ID:"+processInstance.getId());
System.out.println("流程活动ID:"+processInstance.getActivityId());
}
}
其中startProcessInstanceByid(""); 这个id 为 act_re_procdef 表的id。
启动流程后,会发现act_ru ,act_hi 表中会有很多数据了。
1.3 操作数据库表
启动流程实例,操作如下数据库表:
活动包括任务,所以此表中不仅记录了任务,还记录了流程执行过程的其它活动,比如开始事件、 结束事件。
1.4,Businesskey(业务标识)
启动流程实例时,指定的businesskey,就会在act_ru_execution #流程实例的执行表中存储businesskey。
Businesskey:业务标识,通常为业务表的主键,业务标识和流程实例一一对应。业务标识来源于业务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据。 比如:请假流程启动一个流程实例,就可以将请假单的 id 作为业务标识存储到 activiti 中,将来查询 activiti 的流程实例信息就可以获取请假单的 id 从而关联查询业务系统数据库得到请假单信息。
代码:
可以通过启动流程时,将流程定义表的id 和流程业务id businessKey 添加进去。这样act_ru_execution 表中就有business 这个字段值了。
1.5,挂起,激活流程实例
某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会继续执行。
1.5.1 全部流程实例挂起
操作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停: 流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行。
/**
* 挂起或激活流程定义
*/
@Test
public void suspendAllProcessInstance(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//通过RepositoryService找到流程定义的查询类,查询类通过流程定义的id找到具体的流程定义的那条数据
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId("myProcess_1:1:37504")
.singleResult();
boolean suspended = processDefinition.isSuspended();
if (suspended){
//是挂起的话,使用repositoryService激活流程定义
repositoryService.activateProcessDefinitionById(processDefinition.getId(),true,null);
System.out.println("流程定义:"+processDefinition.getId()+"被激活");
}else {
//不是挂起状态的话,使用repositoryService挂起流程
repositoryService.suspendProcessDefinitionById(processDefinition.getId(),true,null);
System.out.println("流程定义:"+processDefinition.getId()+"被挂起");
}
}
1.5.2 单个流程实例挂起
操作流程实例对象,针对单个流程执行挂起操作,某个流程实例挂起则此流程不再继续执行,完成 该流程实例的当前任务将报异常。
/**
* 挂起或激活单个流程实例
*/
@Test
public void suspendOneProcessInstance() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
//通过runtimeService找到流程定义的查询类,查询类通过流程定义的id找到具体的流程定义的那条数据
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId("40001")
.singleResult();
boolean suspended = processInstance.isSuspended();
if (suspended) {
//是挂起的话,使用runtimeService激活流程定义
runtimeService.activateProcessInstanceById(processInstance.getId());
System.out.println("流程实例:" + processInstance.getId() + "被激活");
} else {
//不是挂起状态的话,使用runtimeService挂起流程
runtimeService.suspendProcessInstanceById(processInstance.getId());
System.out.println("流程实例:" + processInstance.getId() + "被挂起");
}
}
细节:
不能继续审批一个已经挂起的流程实例或者流程定义