一.流程部署(壓縮包方式)
/** * 壓縮包的方式部署流程 */ @Test public void deploymentByZip(){ //獲取processEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取一個RepositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //定義一個輸入流,加載Zip文件 InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("bpmn/holiday.zip"); //定義一個ZIPInputStream對象 ZipInputStream zipInputStream=new ZipInputStream(inputStream); //流程部署 Deployment deploy = repositoryService.createDeployment() .addZipInputStream(zipInputStream) .name("請求審批流程") .key("holidayKey") .deploy(); System.out.println("流程名稱:"+deploy.getName()); }
二.流程定義的查看
/** * 流程定義信息的查看 */ @Test public void getProDef(){ //獲取processEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取一個RepositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //得到流程定義查看對象ProcessDefinitionQuery ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); //指定查看的流程 processDefinitionKey()指定流程定義的key值 orderByProcessDefinitionVersion根據流程定義版本號排序 List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("myProcess_1").orderByProcessDefinitionVersion().desc().list(); for (ProcessDefinition proDef:holiday) { System.out.println("流程定義ID:"+proDef.getId()); System.out.println("流程定義的名稱:"+proDef.getName()); System.out.println("流程定義的Key:"+proDef.getKey()); System.out.println("流程定義的版本號:"+proDef.getVersion()); } }
三.流程刪除
/** * 刪除流程: * 假設在刪除時,當前正在有該流程實例執行,那么會導致刪除失敗 * 如果強制要求,則可以使用repositoryService.deleteDeployment("1",true); true代表級聯刪除 */ @Test public void deleteDeployment(){ //獲取processEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取一個RepositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //刪除流程 repositoryService.deleteDeployment("1",true); }
四.獲取數據庫中流程資源信息
依賴:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> <scope>test</scope> </dependency>
/** * 從數據中讀取資源文件到本地 */ @Test public void getResource() throws IOException { //獲取processEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取一個RepositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //獲取到流程查詢對象 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); //獲取到流程資源 processDefinitionQuery.processDefinitionKey("myProcess_1"); //獲取單一結果 ProcessDefinition processDefinition = processDefinitionQuery.singleResult(); //流程部署的ID String deploymentId = processDefinition.getDeploymentId(); //獲取到bpmnResource InputStream bpmnStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName()); //獲取到png InputStream pngStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName()); //構建輸出流 OutputStream bpmnOut = new FileOutputStream("E:\\Test\\" + processDefinition.getResourceName()); OutputStream pngOut = new FileOutputStream("E:\\Test\\" + processDefinition.getDiagramResourceName()); //將數據輸出到磁盤當中 IOUtils.copy(bpmnStream,bpmnOut); IOUtils.copy(pngStream,pngOut); //關流 pngOut.close(); bpmnOut.close(); pngStream.close(); bpmnStream.close(); }
執行效果:
五.業務系統和流程系統進行關聯
/** * 啟動流程實例和業務系統關聯 * 正常應該先添加數據到業務表當中,拿到當前添加數據的主鍵ID,通過啟動流程實例,將主鍵ID交給BuessniessKkey * 代表和流程系統進行關聯 */ @Test public void startInstance(){ /** * 讓張三在頁面提交,然后拿到ID */ /** * 創建張三請假的實例流程 */ //獲取processEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); //生成流程 ProcessInstance holiday = runtimeService.startProcessInstanceByKey("myProcess_1","2"); /** * 張三提交請假審批 */ //獲取一個TaskService對象 TaskService taskService = processEngine.getTaskService(); //獲取張三的任務 Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess_1").singleResult(); //任務審批 taskService.complete(task.getId()); }
六.流程激活和掛起
1.所有流程定義的掛起
/** * 所有流程定義的掛起 */ @Test public void allSuspend(){ //獲取processEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取repositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //獲取流程定義 ProcessDefinition holiday = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").singleResult(); //獲取到當前流程定義是否為暫停狀態 suspended方法為true代表為暫停 false就是運行的 boolean suspended = holiday.isSuspended(); if(suspended){ repositoryService.activateProcessDefinitionById(holiday.getId(),true,null); System.out.println("該流程定義激活"); }else{ repositoryService.suspendProcessDefinitionById(holiday.getId(),true,null); System.out.println("該流程定義暫停"); } }
再次執行
2.單個流程實例的掛起
/** * 單個流程實例的掛起 */ @Test public void singleSuspend(){ //獲取processEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RuntimeService對象 RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("22501").singleResult(); //獲取到當前流程定義是否為暫停狀態 suspended方法為true代表為暫停 false就是運行的 boolean suspended = processInstance.isSuspended(); if(suspended){ runtimeService.activateProcessInstanceById("22501"); System.out.println("xx的請假流程激活"); }else{ runtimeService.suspendProcessInstanceById("22501"); System.out.println("xx的請假流程掛起"); } }
嘗試處理掛起的流程
報出錯誤