1. 程式人生 > 程式設計 >第八節:Activiti6.0——啟動流程相關

第八節:Activiti6.0——啟動流程相關

一、概述

介紹:在啟動流程後,每個流程例項都會有執行流(儲存在act_ru_execution表中)。例項都有主執行流,沒有父id的執行流是流程例項,其後如果流程中有一個分支則有一個子執行流,分支和子執行流一一對應。對執行流可以設定變數,設定子執行流的變數為本地(臨時)變數(自在當前執行流有效),設定主執行流的變數為全域性變數。

二、執行流檢視

  1. 一個分支的流程測試。
  • 流程圖如下:
    single
  • 使用程式碼直接進行部署
	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)
    single執行流
  1. 多個分支的流程。
  • 流程圖如下:
    multi
  • 部署和一個分支的一樣
  • 檢視資料庫
    multi執行流

三、啟動流程的"BUSINESS_KEY_"

概述

  • “BUSINESS_KEY_” 這個為業務主鍵,主流程才會使用業務主鍵,另外這個業務主鍵欄位在表中有唯一約束,可以使用該值進行查詢。業務主鍵在啟動流程時可以設定值,使用startProcessInstanceById()方法的一個過載方法,儲存在act_ru_execution的BUSINESS_KEY_欄位。以下為測試。
  • 上面測試方法的啟動流程方式使用的是runtimeService.startProcessInstanceById()方法,另外runtimeService的startProcessInstanceByKey(String processDefinitionKey)也可以啟動,其中此時的流程定義的key,對應的bpmn檔案的process標籤的id

測試:

  1. 使用的bpmn和單分支的流程圖一樣 2.關鍵程式碼如下:
	//獲取流程定義
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();

	//獲取流程例項,此處的第二個引數對應的是資料庫act_ru_execution的BUSINESS_KEY_
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(),"abc");
複製程式碼
  1. 檢視資料庫
    BUSINESS_KEY_

四、執行流的本地(區域性)變數和全域性變數

**概述:**對執行流可以設定本地變數和全域性變數。本地變數會在當前執行流有效,如果當前執行流complete,則資料庫中的本地變數會被刪除,無法再使用。全域性變數是與主執行流繫結的,在當前流程例項中會一直存在。測試如下:

  1. 流程圖如下:
    scope
  2. 編碼如下:
	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);
複製程式碼
  1. 檢視資料庫
  • TaskA和TaskB在complete之前
    執行流如下:
    complete之前
    變數如下(act_ru_variable表),其中全域性變數是繫結的EXECUTION_ID_是主執行流:
    變數
  • complete之後
    執行流如下,此處的TaskA和TaskB執行已經沒了,可以看ACT_ID_不同:
    執行流
    變數,可以看到本地變數被刪除了,只有全域性變數被儲存下來:
    complete之後

凡人飛