Activiti 5.18啟動流程到完成所有任務之間的資料庫變化
來寫一下Activiti 5.18版本從啟動流程到整個流程結束之間資料庫表的變化
先給出流程圖,很簡單的流程,就是兩個UserTask:
程式碼如下:
DeploymentBuilder builder=repositoryService.createDeployment();
Deployment deployment=builder.addClasspathResource("bpmn/simple_process.bpmn").deploy();
以上程式碼是部署這個流程,部署完畢後,act_re_deployment表中會有一條部署記錄,記錄這次部署的基本資訊,然後是act_ge_bytearray表中有兩條記錄,記錄的是本次上傳的bpmn檔案和對應的圖片檔案,每條記錄都有act_re_deployment表的外來鍵關聯,然後是act_re_procdef表中有一條記錄,記錄的是該bpmn檔案包含的基本資訊,包含act_re_deployment表外來鍵。
注意看這個5001就是act_re_deployment表外來鍵
ProcessDefinition pd=repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance pi=runtimeService.startProcessInstanceById(pd.getId());
以上程式碼是搜尋此次部署對應的流程定義資訊,也就是act_re_procdef表的資訊查詢。然後啟動這個流程。
首先向act_ru_execution表中插入一條記錄,記錄的是這個流程定義的執行例項,其中id和proc_inst_id相同都是流程執行例項id,也就是本次執行這個流程定義的id,包含流程定義的id外來鍵(simpleProcess:1:5004)。
然後向act_ru_task插入一條記錄,記錄的是第一個任務的資訊,也就是開始執行第一個任務。包括act_ru_execution表中的execution_id外來鍵和proc_inst_id外來鍵,也就是本次執行例項id。
然後向act_hi_procinst表和act_hi_taskinst表中各插入一條記錄,記錄的是本次執行例項和任務的歷史記錄:
Task task1=taskService.createTaskQuery().processInstanceId(pi.getId()).taskDefinitionKey("task1").singleResult();
taskService.setVariable(task1.getId(), "var1", "var1");
taskService.complete(task1.getId());
以上程式碼是查詢流程本次執行例項下名為task1的任務,然後給任務設定全域性變數,如果呼叫的是taskService.setVariableLocal方法,則任務執行完畢後,相關變數資料就會刪除,然後再完成任務。
首先向act_ru_variable表中插入變數資訊,包含本次流程執行例項的兩個id外來鍵,但不包括任務的id,因為setVariable方法設定的是全域性變數,也就是整個流程都會有效的變數:
執行完task1後,act_ru_task表中task1的記錄被刪除,新插入task2的記錄:
同時act_ru_execution表中的記錄並沒有刪除,而是將正在執行的任務變成task2
同時向act_hi_var_inst和act_hi_taskinst插入歷史記錄
Task task2=taskService.createTaskQuery().processInstanceId(pi.getId()).taskDefinitionKey("task2").singleResult();
taskService.complete(task2.getId());
以上程式碼是查詢本流程執行例項下的task2並完成task2。
此時整個流程執行完畢,act_ru_task,act_ru_execution和act_ru_variable表全被清空
其實全程有一個表一直在記錄所有動作,就是act_hi_actinst表:
List<HistoricVariableInstance> vars=historyService.createHistoricVariableInstanceQuery().processInstanceId(pi.getId()).list();
for(HistoricVariableInstance var:vars){
System.out.println(var.getVariableName());
System.out.println(var.getValue());
}
以上這段程式碼是查詢act_hi_varinst表中變數歷史記錄的。因為流程執行完畢act_ru_variable表被清空。
講解完畢!