什么是流程部署?
参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例。是动态的。
流程定义和流程实例的图解
流程部署
使用压缩包的方式部署流程
1 /** 2 * 压缩包的方式部署流程 3 */ 4 @Test 5 public void deploymentByZip(){ 6 //获取processEngine对象 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取一个RepositoryService对象 9 RepositoryService repositoryService = processEngine.getRepositoryService(); 10 //定义一个输入流,加载Zip文件 11 InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("flowchart/process.zip"); 12 //定义一个ZIPInputStream对象 13 ZipInputStream zipInputStream=new ZipInputStream(inputStream); 14 //流程部署 15 Deployment deploy = repositoryService.createDeployment() 16 .addZipInputStream(zipInputStream) 17 .name("请求审批流程") 18 .key("processKey") 19 .deploy(); 20 System.out.println("流程名称:"+deploy.getName()); 21 22 }
结果
流程定义的查看
流程定义信息的查看
1 /** 2 * 流程定义信息的查看 3 */ 4 @Test 5 public void getProDef(){ 6 //获取processEngine对象 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取一个RepositoryService对象 9 RepositoryService repositoryService = processEngine.getRepositoryService(); 10 //得到流程定义查看对象ProcessDefinitionQuery 11 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); 12 //指定查看的流程 processDefinitionKey()指定流程定义的key值 orderByProcessDefinitionVersion根据流程定义版本号排序 13 List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("myProcess").orderByProcessDefinitionVersion().desc().list(); 14 for (ProcessDefinition proDef:holiday) { 15 System.out.println("流程定义ID:"+proDef.getId()); 16 System.out.println("流程定义的名称:"+proDef.getName()); 17 System.out.println("流程定义的Key:"+proDef.getKey()); 18 System.out.println("流程定义的版本号:"+proDef.getVersion()); 19 } 20 }
结果
流程删除
1 /** 2 * 删除流程: 3 * 假设在删除时,当前正在有该流程实例执行,那么会导致删除失败 4 * 如果强制要求,则可以使用repositoryService.deleteDeployment("1",true); true代表级联删除 5 */ 6 @Test 7 public void deleteDeployment(){ 8 //获取processEngine对象 9 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 10 //获取一个RepositoryService对象 11 RepositoryService repositoryService = processEngine.getRepositoryService(); 12 //删除流程 13 repositoryService.deleteDeployment("1",true); 14 }
结果
获取数据库中流程资源信息
1 /** 2 * 从数据中读取资源文件到本地 3 */ 4 @Test 5 public void getResource() throws IOException { 6 //获取processEngine对象 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取一个RepositoryService对象 9 RepositoryService repositoryService = processEngine.getRepositoryService(); 10 //获取到流程查询对象 11 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); 12 //获取到流程资源 13 processDefinitionQuery.processDefinitionKey("myProcess"); 14 //获取单一结果 15 ProcessDefinition processDefinition = processDefinitionQuery.singleResult(); 16 //流程部署的ID 17 String deploymentId = processDefinition.getDeploymentId(); 18 //获取到bpmnResource 19 InputStream bpmnStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName()); 20 //获取到png 21 InputStream pngStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName()); 22 //构建输出流 23 OutputStream bpmnOut = new FileOutputStream("D:\\北大青鸟作业\\2020年的练习\\20200402\\" + processDefinition.getResourceName()); 24 OutputStream pngOut = new FileOutputStream("D:\\北大青鸟作业\\2020年的练习\\20200402\\" + processDefinition.getDiagramResourceName()); 25 //将数据输出到磁盘当中 26 IOUtils.copy(bpmnStream,bpmnOut); 27 IOUtils.copy(pngStream,pngOut); 28 //关流 29 pngOut.close(); 30 bpmnOut.close(); 31 pngStream.close(); 32 bpmnStream.close(); 33 }
注意:IOUtils.copy()方法是import org.apache.commons.io.IOUtils;下的方法不是import sun.misc.IOUtils;
结果
业务系统和流程系统进行关联
通过buessinessKey字段标识业务系统的主键数据ID,进而表名当前业务执行到了哪一个流程
1 /** 2 * 启动流程实例和业务系统关联 3 * 正常应该先添加数据到业务表当中,拿到当前添加数据的主键ID,通过启动流程实例,将主键ID交给BuessniessKkey 4 * 代表和流程系统进行关联 5 */ 6 @Test 7 public void startInstance(){ 8 /** 9 * 让张三在页面提交,然后拿到ID 10 */ 11 12 /** 13 * 创建张三请假的实例流程 14 */ 15 //获取processEngine对象 16 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 17 RuntimeService runtimeService = processEngine.getRuntimeService(); 18 //生成流程 19 ProcessInstance holiday = runtimeService.startProcessInstanceByKey("myProcess","2"); 20 21 /** 22 * 张三提交请假审批 23 */ 24 //获取一个TaskService对象 25 TaskService taskService = processEngine.getTaskService(); 26 //获取张三的任务 27 Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess").singleResult(); 28 //任务审批 29 taskService.complete(task.getId()); 30 }
结果:
流程激活和挂起
所有流程定义的挂起
1 /** 2 * 所有流程定义的挂起 3 */ 4 @Test 5 public void allSuspend(){ 6 //获取processEngine对象 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取repositoryService对象 9 RepositoryService repositoryService = processEngine.getRepositoryService(); 10 //获取流程定义 11 ProcessDefinition holiday = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess").singleResult(); 12 //获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的 13 boolean suspended = holiday.isSuspended(); 14 if(suspended){ 15 repositoryService.activateProcessDefinitionById(holiday.getId(),true,null); 16 System.out.println("该流程定义激活"); 17 }else{ 18 repositoryService.suspendProcessDefinitionById(holiday.getId(),true,null); 19 System.out.println("该流程定义暂停"); 20 } 21 }
第一次运行结果
第二次运行结果
单个流程实例的挂起
1 /** 2 * 单个流程实例的挂起 3 */ 4 @Test 5 public void singleSuspend(){ 6 //获取processEngine对象 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取RuntimeService对象 9 RuntimeService runtimeService = processEngine.getRuntimeService(); 10 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("5001").singleResult(); 11 12 //获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的 13 boolean suspended = processInstance.isSuspended(); 14 if(suspended){ 15 runtimeService.activateProcessInstanceById("5001"); 16 System.out.println("xx的请假流程激活"); 17 }else{ 18 runtimeService.suspendProcessInstanceById("5001"); 19 System.out.println("xx的请假流程挂起"); 20 } 21 }
第一次运行结果
第二次运行结果