第八節:Activiti6.0——啟動流程相關
阿新 • • 發佈:2020-06-24
一、概述
介紹:在啟動流程後,每個流程例項都會有執行流(儲存在act_ru_execution表中)。例項都有主執行流,沒有父id的執行流是流程例項,其後如果流程中有一個分支則有一個子執行流,分支和子執行流一一對應。對執行流可以設定變數,設定子執行流的變數為本地(臨時)變數(自在當前執行流有效),設定主執行流的變數為全域性變數。
二、執行流檢視
- 一個分支的流程測試。
- 流程圖如下:
- 使用程式碼直接進行部署
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
//釋出資源
Deployment deployment = repositoryService.createDeployment().addClasspathResource("single.bpmn").deploy();
//獲取流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//獲取流程例項
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
//列印流程例項id,即主執行流。結果:97505
System.out.println(processInstance.getId());
//關閉
processEngine.close();
System.exit(0);
複製程式碼
- 檢視資料庫(act_ru_execution)
- 多個分支的流程。
- 流程圖如下:
- 部署和一個分支的一樣
- 檢視資料庫
三、啟動流程的"BUSINESS_KEY_"
概述:
- “BUSINESS_KEY_” 這個為業務主鍵,主流程才會使用業務主鍵,另外這個業務主鍵欄位在表中有唯一約束,可以使用該值進行查詢。業務主鍵在啟動流程時可以設定值,使用startProcessInstanceById()方法的一個過載方法,儲存在act_ru_execution的BUSINESS_KEY_欄位。以下為測試。
- 上面測試方法的啟動流程方式使用的是runtimeService.startProcessInstanceById()方法,另外runtimeService的startProcessInstanceByKey(String processDefinitionKey)也可以啟動,其中此時的流程定義的key,對應的bpmn檔案的process標籤的id。
測試:
- 使用的bpmn和單分支的流程圖一樣 2.關鍵程式碼如下:
//獲取流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//獲取流程例項,此處的第二個引數對應的是資料庫act_ru_execution的BUSINESS_KEY_
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(),"abc");
複製程式碼
- 檢視資料庫
四、執行流的本地(區域性)變數和全域性變數
**概述:**對執行流可以設定本地變數和全域性變數。本地變數會在當前執行流有效,如果當前執行流complete,則資料庫中的本地變數會被刪除,無法再使用。全域性變數是與主執行流繫結的,在當前流程例項中會一直存在。測試如下:
- 流程圖如下:
- 編碼如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("scope.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("流程例項id:" + processInstance.getId());
System.out.println("========================================================");
//查詢任務,首次查詢時兩個任務是並行的,所有會有兩個任務
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
taskList.forEach(tempTask-> {
//首先查詢執行流
Execution execution = runtimeService.createExecutionQuery().executionId(tempTask.getExecutionId()).singleResult();
if ("TaskA".equals(tempTask.getName())){
//給執行流A設定本地變數,即為在當前執行流執行.如果當前執行流complete,則該變數會被刪除。繫結在執行流上的
runtimeService.setVariableLocal(execution.getId(),"taskVarA","varA");
System.out.println("給執行流TaskA設定本地變數 varA 完成");
}else {
//給執行流B設定全域性變數,在當前例項都可以獲取到,是直接繫結到流程例項上的
runtimeService.setVariable(execution.getId(),"taskVarB","varB");
runtimeService.setVariable(execution.getId(),"taskVarB2","varB2");
System.out.println("給執行流TaskB設定全域性變數 varB和varB2 完成");
}
});
//臨時暫停30s,檢視資料庫變化
Thread.sleep(30000);
//將TaskA和TaskB完成,到達TaskC可以進行引數查詢
taskList.forEach(task -> taskService.complete(task.getId()));
System.out.println("========================================================");
//進行引數查詢
Task taskC = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
System.out.println("當前任務:" + taskC.getName() + ". 獲取執行流引數如下:");
System.out.println(runtimeService.getVariable(taskC.getExecutionId(),"taskVarA"));
System.out.println(runtimeService.getVariable(taskC.getExecutionId(),"taskVarB"));
processEngine.close();
System.exit(0);
複製程式碼
- 檢視資料庫
- TaskA和TaskB在complete之前
執行流如下: 變數如下(act_ru_variable表),其中全域性變數是繫結的EXECUTION_ID_是主執行流: - complete之後
執行流如下,此處的TaskA和TaskB執行已經沒了,可以看ACT_ID_不同: 變數,可以看到本地變數被刪除了,只有全域性變數被儲存下來:
凡人飛