流程部署完成后,每啟動一次流程就是一個流程實例。
(一)根據流程定義key啟動流程實例
ProcessInstance processInstance = runtimeServic.startProcessInstanceByKey("myProcess_1");
每個執行是單獨的流程實例,不同的實例之間不會相互干擾。
在任務節點表ACT_RU_TASK生成任務實例數據。
(二)啟動流程實例的時候指定businesskey(業務標識)
//第一個參數:是指流程定義key //第二個參數:業務標識businessKey ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", "sn001");
businesskey:業務標識,業務標識來源於業務系統。通常為業務表的主鍵,根據業務標識來關聯查詢業務系統的數據。
啟動流程實例時,指定的businesskey,就會在ACT_RU_EXECUTION #流程實例的執行表中存儲businesskey
(三)查詢流程實例
可以查看流程實例的狀態,當前運行結點等信息。
/** * 查詢指定流程的所有實例 */ @Test public void processInstanceQuery() { String processDefinitionKey = "myProcess_1"; List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).list(); for (ProcessInstance instance : list) { System.out.println("流程實例id: " + instance.getProcessInstanceId()); System.out.println("所屬流程定義id: " + instance.getProcessDefinitionId()); System.out.println("是否執行完成: " + instance.isEnded()); System.out.println("是否暫停: " + instance.isSuspended()); System.out.println(" 當 前 活 動 標 識 : " + instance.getActivityId()); } }
(四)刪除已經部署成功的流程
/** * 刪除已經部署的流程定義 * delete from ACT_RE_DEPLOYMENT 流程部署信息表; * ACT_RE_PROCDEF 流程定義數據表; * ACT_GE_BYTEARRAY 二進制數據表; */ @Test public void deleteProcessDefinition(){ //執行刪除流程定義 參數代表流程部署的id repositoryService.deleteDeployment("b10a151b-3366-11ea-bc18-30b49ec7161f"); }
1.當我們正在執行的這一套流程沒有完全審批結束的時候,此時如果要刪除流程定義信息就會失敗。
2.如果要求強制刪除,可以使用repositoryService.deleteDeployment("myProcess_1:1:f482ce07-35bf-11ea-b325-30b49ec7161f",true);
參數true代表級聯刪除,此時就會先刪除沒有完成的流程結點,最后就可以刪除流程定義信息 false的值代表不級聯
(五)刪除流程實例
當前流程實例沒有完全結束的時候,刪除流程實例就會失敗
/** * 刪除流程實例 */ @Test public void deleteProcessInstance(){ String processInstanceId = "80a5703b-35c0-11ea-aa1a-30b49ec7161f"; //當前流程實例沒有完全結束的時候,刪除流程實例就會失敗 runtimeService.deleteProcessInstance(processInstanceId,"刪除原因"); }
執行刪除部分SQL如下 :
1。 ACT_RU_TASK 運行時任務節點表
delete from ACT_RU_TASK where ID_ = ? and REV_ = ?
2。 ACT_RU_IDENTITYLINK 運行時流程人員表,主要存儲任務節點與參與者的相關信息
delete from ACT_RU_IDENTITYLINK where ID_ = ?
3。 ACT_RU_EXECUTION 運行時流程執行實例表
delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ?
執行更新部分SQL如下:
1。 ACT_HI_PROCINST 歷史流程實例表
update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ? where ID_ = ?
2。 ACT_HI_ACTINST 歷史節點表
update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_ = ?, DURATION_ = ? where ID_ = ?
3。 ACT_HI_TASKINST 歷史任務實例表
update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?, PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?, CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?, TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where ID_ = ?
(六)操作流程掛起、激活
操作流程定義為掛起狀態,該流程定義下邊所有的流程實例全部暫停;
流程定義為掛起狀態該流程定義將不允許啟動新的流程實例,同時該流程定義下所有的流程實例將全部掛起暫停執行。
/** * 操作流程的掛起、激活 */ @Test public void activateProcessDefinitionById(){ //查詢流程定義對象 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").singleResult(); //當前流程定義的實例是否都為暫停狀態 boolean suspended = processDefinition.isSuspended(); String processDefinitionId = processDefinition.getId(); if(suspended){ //掛起狀態則激活 repositoryService.activateProcessDefinitionById(processDefinitionId,true,new Date()); System.out.println("流程定義:"+processDefinitionId+"激活"); }else{ //激活狀態則掛起 repositoryService.suspendProcessDefinitionById(processDefinitionId,true,new Date()); System.out.println("流程定義:"+processDefinitionId+"掛起"); } }
(七)單個流程實例的掛起,激活
/** * 單個流程實例的掛起,激活 */ @Test public void activateProcessInstanceById(){ //查詢流程實例對象 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("80a5703b-35c0-11ea-aa1a-30b49ec7161f").singleResult(); //當前流程定義的實例是否都為暫停狀態 boolean suspended = processInstance.isSuspended(); String processInstanceId = processInstance.getId(); if(suspended){ //激活 runtimeService.activateProcessInstanceById(processInstanceId); System.out.println("流程:"+processInstanceId+"激活"); }else{ //掛起 runtimeService.suspendProcessInstanceById(processInstanceId); System.out.println("流程:"+processInstanceId+"掛起"); } }
(八)實例任務的執行
/** * 完成任務 */ @Test public void completeTask(){ //任務ID String taskId = "967465fe-3367-11ea-a057-30b49ec7161f"; taskService.complete(taskId); System.out.println("完成任務:任務ID:"+taskId); }
當流程實例的所有任務都終止后,流程實例也就結束了;
(九)設置流程實例的啟動者
//設置當前用戶id,啟動流程會讀取這個信息,對應processInstance.getStartUserId() Authentication.setAuthenticatedUserId(String.valueOf(user.getId()));
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(pd.getKey());
System.out.println("實例Id:"+processInstance.getId());
System.out.println("StartUserId:"+processInstance.getStartUserId());
打開act_hi_procinst表,看到該記錄的START_USER_ID_字段記錄了設置的用戶id
源碼下載 https://download.csdn.net/download/zsg88/12100238