有時候,我們需要對一個已經執行的流程進行暫停,而不是刪除它,這個時候就需要我們調用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); }
這個時候,我們再繼續運行已經發起的流程實例,發現已經運行不起來了!!!