Activiti的流程实例及挂起激活(七)
1.1什么是流程实例
参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例。是动
态的。
流程定义和流程实例的图解:
1.2启动流程实例
流程定义部署在 activiti 后,就可以在系统中通过 activiti 去管理该流程的执行,执行流程表示流
程的一次执行。比如部署系统请假流程后,如果某用户要申请请假这时就需要执行这个流程,如果
另外一个用户也要申请请假则也需要执行该流程,每个执行互不影响,每个执行是单独的流程实例
执行流程首先需要启动流程实例。
@Test public void startProcessInstance() { // 流程定义key String processDefinitionKey = ""; // 获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); // 根据流程定义key启动流程 ProcessInstance processInstance = runtimeServic.startProcessInstanceByKey(processDefinitionKey); System.out.println(" 流 程 定 义 id : " + processInstance.getProcessDefinitionId()); System.out.println("流程实例id: " + processInstance.getId()); System.out.println("当前活动Id: " + processInstance.getActivityId()); }
1.3Businesskey(业务标识)
启动流程实例时,指定的businesskey,就会在act_ru_execution #流程实例的执行表中存储businesskey。
Businesskey:业务标识,通常为业务表的主键,业务标识和流程实例一一对应。业务标识来源于业
务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据。
比如: 请假流程启动一个流程实例,就可以将请假单的 id 作为业务标识存储到 activiti 中,将来查询
activiti 的流程实例信息就可以获取请假单的 id 从而关联查询业务系统数据库得到请假单信息。
/** * 启动流程实例,添加进businessKey * * 本质:act_ru_execution表中的businessKey的字段要存入业务标识 */ public class BusinessKeyAdd { public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RuntimeService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); //3.启动流程实例,同时还要指定业务标识businessKey 它本身就是请假单的id //第一个参数:是指流程定义key //第二个参数:业务标识businessKey ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday", "1001"); //4.输出processInstance相关的属性,取出businessKey使用:processInstance.getBusinessKey() System.out.println(processInstance.getBusinessKey()); } }
1.4操作数据库表
启动流程实例,操作如下数据库表:
SELECT * FROM act_ru_execution #流程实例执行表,记录当前流程实例的执行情况
说明:
流程实例执行,如果当前只有一个分支时,一个流程实例只有一条记录且执行表的主键 id 和流程实
例 id 相同,如果当前有多个分支正在运行则该执行表中有多条记录,存在执行表的主键和流程实例
id 不相同的记录。 不论当前有几个分支总会有一条记录的执行表的主键和流程实例 id 相同
一个流程实例运行完成,此表中与流程实例相关的记录删除。
SELECT * FROM act_ru_task #任务执行表,记录当前执行的任务
说明:启动流程实例,流程当前执行到第一个任务结点,此表会插入一条记录表示当前任务的执行
情况,如果任务完成则记录删除。
SELECT * FROM act_ru_identitylink #任务参与者,记录当前参与任务的用户或组
SELECT * FROM act_hi_procinst #流程实例历史表
流程实例启动,会在此表插入一条记录,流程实例运行完成记录也不会删除。
SELECT * FROM act_hi_taskinst #任务历史表,记录所有任务
开始一个任务,不仅在 act_ru_task 表插入记录,也会在历史任务表插入一条记录,任务历史表的主
键就是任务 id,任务完成此表记录不删除。
SELECT * FROM act_hi_actinst #活动历史表,记录所有活动
活动包括任务,所以此表中不仅记录了任务,还记录了流程执行过程的其它活动,比如开始事件、
结束事件
1.5查询流程实例
流程在运行过程中可以查询流程实例的状态,当前运行结点等信息。
@Test public void queryProcessInstance() { // 流程定义key String processDefinitionKey = "holiday"; // 获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey)//.list(); for (ProcessInstance processInstance : list) { System.out.println("----------------------------"); System.out.println("流程实例id: "+ processInstance.getProcessInstanceId()); System.out.println("所属流程定义id: "+ processInstance.getProcessDefinitionId()); System.out.println("是否执行完成: " + processInstance.isEnded()); System.out.println("是否暂停: " + processInstance.isSuspended()); System.out.println(" 当 前 活 动 标 识 : " + processInstance.getActivityId()); } }
1.6挂起、激活流程实例
某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会继续执
行。
1.6.1 全部流程实例挂起
操作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停:
流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将
全部挂起暂停执行
/** * 全部流程实例挂起与激活 * * */ public class SuspendProcessInstance { public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); //3.查询流程定义的对象 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("holiday").singleResult(); //4.得到当前流程定义的实例是否都为暂停状态 boolean suspended = processDefinition.isSuspended(); String processDefinitionId = processDefinition.getId(); //5.判断 if(suspended){ //说明是暂停,就可以激活操作 repositoryService.activateProcessDefinitionById(processDefinitionId,true ,null); System.out.println("流程定义:"+processDefinitionId+"激活"); }else{ repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null); System.out.println("流程定义:"+processDefinitionId+"挂起"); } } }
在执行一次
1.6.2 单个流程实例挂起
操作流程实例对象,针对单个流程执行挂起操作,某个流程实例挂起则此流程不再继续执行, 完成
该流程实例的当前任务将报异常。
/** * 单个流程实例挂起与激活 * * */ public class SuspendProcessInstance2 { public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //3.查询流程实例对象 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId("2501").singleResult(); //4.得到当前流程定义的实例是否都为暂停状态 boolean suspended = processInstance.isSuspended(); String processInstanceId = processInstance.getId(); //5.判断 if(suspended){ //说明是暂停,就可以激活操作 runtimeService.activateProcessInstanceById(processInstanceId); System.out.println("流程:"+processInstanceId+"激活"); }else{ runtimeService.suspendProcessInstanceById(processInstanceId); System.out.println("流程定义:"+processInstanceId+"挂起"); } } }