1.什么是流程實例
**流程實例()**代表流程定義的執行實例。
一個流程實例包含了所有的運行節點。我們可以利用這個對象來了解當前流程實例的進度等信息。
例如:用戶或程序按照流程定義內容發起一個流程,就是一個流程實例
流程定義和流程實例的圖解:
2.啟動流程實例
流程定義部署后,就可以通過去管理流程的執行,執行流程表示流程的一次執行。
比如部署出差流程后,某個用戶申請出差就需要執行這個出差流程,另一用戶同樣也可以執行這個出差流程,兩個流程實例之間是互不影響的,每個執行的都是單獨的流程實例。
啟動流程實例時,指定,就會在表中存儲
:業務標識,通常為業務表的主鍵,業務標識與流程實例對應。業務標識來源于業務系統,存儲的業務標識就是為了關聯查詢業務系統數據。
比如:啟動一個出差流程實例,就可以將出差申請單的id作為業務標識存到中,將來查詢流程實例信息時,就可以查出業務標識,從而查詢出業務系統到中的出差單詳細信息。
2.1啟動流程實例編碼
/**
* 啟動實例,添加業務標識businessKey
*/
@Test
public void addBusinessKey() {
//得到processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//得到runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
/**
* 啟動實例,同時指定業務標識businessKey
* startProcessInstanceByKey(String processDefinitionKey, String businessKey)
* processDefinitionKey:流程定義的key
* businessKey:業務標識,根據業務參數傳入
*/
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("evection", "1001");
//輸出流程實例信息中的業務標識
System.out.println("業務標識:" + processInstance.getBusinessKey());
}
2.2啟動流程實例操作表說明
啟動流程實例,操作表如下:
流程實例執行表,記錄當前流程實例的執行情況,一個流程實例運行完成,此表的流程實例相關記錄也會刪除。
該表中總會有一條記錄的主鍵id和流程實例id相同。
任務參與者表,記錄當前參與任務的用戶或組
流程實例歷史表
流程啟動,會在此表插入一條記錄,流程實例運行完成不會刪除。
任務歷史表,記錄所有任務
開始一個任務,不僅在表插入記錄,也會在歷史任務表插入一條記錄,任務歷史表的主鍵就是任務id,任務完成此表記錄不刪除。
活動歷史表,記錄所有活動
活動包括任務,所以此表中不僅記錄了任務,還記錄了流程執行過程的其他活動,比如開始事件、結束事件。
3.查詢流程實例
流程在運行過程中可以查詢流程實例的狀態,當前運行節點等信息
/**
* 查詢流程實例
*/
@Test
public void queryTaskProcess() {
//流程定義key
String processDefinitionKey = "evection";
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//獲取流程實例
List<ProcessInstance> instanceList = runtimeService
.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.list();
instanceList.forEach(instance -> {
System.out.println("========================");
System.out.println("流程實例id:" + instance.getId());
System.out.println("所屬流程定義id:" + instance.getProcessDefinitionId());
System.out.println("是否執行完成:" + instance.isEnded());
System.out.println("是否暫停:" + instance.isSuspended());
System.out.println("當前活動標識id:" + instance.getActivityId());
});
}
4.關聯
需求:
在實際應用時,查詢流程實例列表時可能要顯示業務系統的一些相關信息,比如:查詢當前運行的出差流程列表需要列出出差單名稱、出差天數等信息,而出差天數等信息是由業務系統定義的,存在業務系統中,并沒有在數據庫中存儲,所以無法通過查詢到出差天數信息。
實現:
當查詢流程實例時,通過(業務標識)關聯查詢業務系統的出差單表,查詢出出差天數等信息。但是前提是,在啟動流程實例的時候,需要將存儲到中,一般存相關業務操作表的主鍵id。
添加方式為:
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("evection", "1001");
之后可以從中獲取,再通過去獲取對應業務表中的數據。
獲取方式為:
String businessKey = processInstance.getBusinessKey();
在的表中沒有任務的實例在運行,字段就是存放業務KEY的
5.掛起/激活流程實例
在某些情況下,由于流程變更需要將當前運行的流程暫停而不是直接刪除,就需要暫停流程,不再繼續執行。
5.1全部流程實例掛起/激活
操作流程定義為掛起狀態,該流程定義下邊所有的流程實例全部暫停。
流程定義為掛起狀態,該流程定義將不允許啟動新的流程實例沒有任務的實例在運行,同時該流程定義下所有的流程實例將全部掛起暫停執行,完成流程定義下的流程實例將會拋異常
/**
* 全部流程實例掛掛起===》直接將對應的流程定義掛起,該流程定義下的所有流程實例掛起
* 全部流程實例掛激活===》直接將對應的流程定義激活,該流程定義下的所有流程實例激活
*/
@Test
public void suspendAllProcessInstance() {
//獲取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//查詢流程定義對象
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("evection")
.singleResult();
//得到當前流程定義是否為掛起狀態
boolean suspended = processDefinition.isSuspended();
//流程定義id
String processDefinitionId = processDefinition.getId();
//判斷是否掛起
if (suspended) {
//如果是掛起,執行激活操作
//參數1:流程定義id 參數2:是否激活 參數3:激活時間
repositoryService.activateProcessDefinitionById(processDefinitionId, true, null);
System.out.println("流程定義:" + processDefinitionId + ",已激活");
} else {
//如果是激活,執行掛起操作
//參數1:流程定義id 參數2:是否掛起 參數3:掛起時間
repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null);
System.out.println("流程定義:" + processDefinitionId + ",已掛起");
}
}
5.2單個流程實例掛起/激活
操作流程實例對象,針對單個流程執行掛起/激活操作,當某個流程實例掛起后則此流程不再繼續執行,完成該流程實例將會拋出異常。
/**
* 單個流程實例掛起與激活
*/
@Test
public void suspendSingleProcessInstance() {
//獲取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//查詢流程實例對象
ProcessInstance processInstance = runtimeService
.createProcessInstanceQuery()
//流程實例id根據自己的數據填寫
.processInstanceId("30001")
.singleResult();
//得到當前流程實例是否是掛起狀態
boolean suspended = processInstance.isSuspended();
//流程實例id
String processInstanceId = processInstance.getId();
//判斷是否掛起
if (suspended) {
//如果是掛起,執行激活操作
//參數1:流程實例id
runtimeService.activateProcessInstanceById(processInstanceId);
System.out.println("流程實例:" + processInstanceId + ",已激活");
} else {
//如果是激活,執行掛起狀態
//參數1:流程實例id
runtimeService.suspendProcessInstanceById(processInstanceId);
System.out.println("流程實例:" + processInstanceId + ",已掛起");
}
當流程定義或者某個流程實例掛起,完成流程實例將會拋出異常。