(3)activiti流程的掛起和激活


有時候,我們需要對一個已經執行的流程進行暫停,而不是刪除它,這個時候就需要我們調用activiti暫停和激活的api來操作他們

  每啟動一個流程實例,都會在該流程實例下產生相應的流程任務,處於1*多的關系,每次流程實例運行到某一個節點下,都會在當前任務表act_ru_task產生一個或者多個任務(一般情況是一個,出現分支會多個),

結束一個任務我們可以看到當前運行的任務表act_ru_task會刪除這個任務task,而在歷史任務表act_hi_taskinst中(通過historyService)可以查詢到剛才流程實例下的所有的task,

  從上述觀察中,得出結論,獲取當前的任務,可以從taskService和historyService都可以獲取,但是我們查詢當前任務都是從taskService中查詢,因為里面任務執行完就會刪掉,數據少,查詢速度快,同樣的道理,

我們查詢流程實例,也可以從runtimeService和historyService中查詢,但是優先考慮runtimeService,除非查詢歷史流程實例

 

(1)測試暫停流程實例執行步驟如下:

  1,通過流程定義的key或者id啟動一個流程實例

  2,根據流程實例的id來掛起這個流程實例

  3,得到下一個節點的對應的任務的id,調用taskService來完成這個任務觀察效果

    4,重新激活這個流程實例

  5,繼續完成這個流程實例

 

執行代碼如下:

  1,流程實例的啟動,我們已經在前面的代碼中演示過,這里不做演示

  2,通過上面發起的流程實例的id掛起這個流程實例

/**
     * 測試掛起一個流程實例
     */
    @Test
    public void testSuspendProcessInstance(){
        RuntimeService runtimeService = engine.getRuntimeService();
        
        String processInstanceId="1801";
        //根據一個流程實例的id掛起該流程實例
        runtimeService.suspendProcessInstanceById(processInstanceId);
        
    }

  3,任務的下一處理人來完成這個實例

//完成一個流程
    @Test
    public void completeProcessInstance(){
        
        //任務的id,后期整合后會通過當前登錄人身份查詢到該用戶的任務,然后獲取到該id
        String taskId="1804";
        TaskService taskService = engine.getTaskService();
        //根據任務id完成該任務
        taskService.complete(taskId);
        
    }

  執行完報錯:

  

  上面的信息說明無法完成一個已經被掛起的任務

  

  4,激活這個流程實例

  

/**
     * 激活一個流程實例
     */
    @Test
    public void testActivateProcessInstance(){
        RuntimeService runtimeService = engine.getRuntimeService();
        
        String processInstanceId="1801";
        
        runtimeService.activateProcessInstanceById(processInstanceId);
    }

  5,重新完成這個任務,執行ok

 

 

(2)測試暫停流程定義執行步驟如下:

在程序中,我們需要暫停一個流程定義,停止所有的該流程定義下的流程實例,並且不允許發起這個流程定義的流程實例,那么我們就需要掛起這個流程定義

  1,啟動一個流程實例(該流程定義未掛起前)

  2,掛起上面流程實例對應的流程定義

  3,完成上述流程實例的下一個任務節點(觀察效果,是否會和流程實例掛起一樣)

  

執行代碼如下:

  1,啟動一個流程實例

  2,掛起這個流程實例對應的流程定義(這里可以通過流程定義的key和流程定義的id來掛起,我這里只用流程定義的key方便演示)

  

@Test
    public void testSuspendProcessDefinition(){
        RepositoryService repositoryService = engine.getRepositoryService();
        
        String processDefinitionKey ="purchasingflow";
        //根據流程定義的key暫停一個流程定義
        repositoryService.suspendProcessDefinitionByKey(processDefinitionKey );
        
    }

  3,完成這個流程實例的下一個節點,通過taskService來結束下一個任務節點

  這時候,我們發現這個流程實例居然是可以繼續執行的,並且可以執行到結束,帶着這個疑問,我們再啟動一個流程實例看看

  4,重新啟動這個流程定義下的流程實例

  

  

  報錯說不可以啟動這個被掛起流程定義的流程實例

  怎么回事呢??

  我們又仔細的看了流程定義的掛起api,發現還有這么個api

void suspendProcessDefinitionById(String processDefinitionId, boolean suspendProcessInstances, Date suspensionDate);
void suspendProcessDefinitionByKey(String processDefinitionKey, boolean suspendProcessInstances, Date suspensionDate);

 

參數分別是  processDefinitionId(processDefinitionKey):流程定義的id(key)

       suspendProcessInstances:是否級聯掛起該流程定義下的流程實例

       suspensionDate:設置掛起這個流程定義的時間,如果不填寫,則立即掛起

  到這里我們知道為什么掛起這個流程定義,為什么流程定義下的流程實例還可以繼續運行了

  下面我們掛起這個流程定義,並且級聯掛起該流程定義下的流程實例

  

@Test
    public void testActivateProcessDefinitionCascade(){
        RepositoryService repositoryService = engine.getRepositoryService();
        
        String processDefinitionKey ="purchasingflow";
        //根據流程定義的key暫停一個流程定義,並且級聯掛起該流程定義下的流程實例
        repositoryService.suspendProcessDefinitionByKey(processDefinitionKey, true, null);
        
    }

  這個時候,我們再繼續運行已經發起的流程實例,發現已經運行不起來了!!!

  

  

 

  

  

  

 

  

  

 

 

 

 

  

  

  

  


免責聲明!

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



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