Activiti流程實例


一.流程部署(壓縮包方式)

/**
     * 壓縮包的方式部署流程
     */
    @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的請假流程掛起");
        }
    }

嘗試處理掛起的流程

報出錯誤

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM