1. 程式人生 > >Activiti 5.18啟動流程到完成所有任務之間的資料庫變化

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表被清空。

講解完畢!