歷史是記錄流程執行過程中發生的事情,并將其永久存儲的組件。與運行時數據不同,歷史數據在流程實例完成以后仍保存在數據庫中。
有6個歷史實體:
* HistoricProcessInstance 保存當前及已結束流程實例的信息。
* HistoricVariableInstance 保存流程變量或任務變量的最新值。
* HistoricActivityInstance 保存活動(流程中的節點)的一次執行的信息。
* HistoricTaskInstance 保存當前與歷史(完成及刪除的)任務實例的信息。
* HistoricIdentityLink 保存任務及流程實例、當前及歷史的身份關聯的信息。
* HistoricDetail 保存與歷史流程實例、活動實例或任務實例等有關的多種信息。
歷史與當前進行中的流程實例都在數據庫中保存歷史實體,因此可以選擇直接查詢歷史表,以減少對運行時流程實例數據的訪問,并提高運行時執行的性能。
歷史查詢可以調用 HistoryService 接口中的API來完成。下面是幾個例子。
<br/>
**1. 歷史流程實例查詢:HistoricProcessInstance**
```java
@Test
public void historicProcessInstancesQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery()
.finished() //流程實例已完成
.processDefinitionId("evectionHistory:2:117504") //流程定義Id
.includeProcessVariables() //包含全局流程變量
.orderByProcessInstanceDuration()
.desc() //根據整個流程實例完成時間降序排序
.listPage(0, 10); //分頁查詢
list.forEach(h -> {
System.out.println("業務標識: " + h.getBusinessKey());
System.out.println("流程部署Id: " + h.getDeploymentId());
System.out.println("流程實例Id: " + h.getId());
System.out.println("完成整個流程實例所花的時間: " + h.getDurationInMillis() + "ms");
System.out.println("流程結束節點Id: " + h.getEndActivityId());
System.out.println("流程開始節點Id: " + h.getStartActivityId());
System.out.println("流程定義Id: " + h.getProcessDefinitionId());
System.out.println("流程key: " + h.getProcessDefinitionKey());
System.out.println("流程定義版本: " + h.getProcessDefinitionVersion());
System.out.println("流程實例變量: " + h.getProcessVariables());
System.out.println("");
});
//業務標識: null
//流程部署Id: 117501
//流程實例Id: 120001
//完成整個流程實例所花的時間: 148801ms
//流程結束節點Id: _7
//流程開始節點Id: _2
//流程定義Id: evectionHistory:2:117504
//流程key: evectionHistory
//流程定義版本: 2
//全局流程變量: {assignee4=趙六, assignee3=王五, assignee2=李四, assignee1=張三}
}
```
**2. 歷史變量實例查詢:HistoricVariableInstance**
```java
@Test
public void historicVariableInstanceQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery()
.processInstanceId("120001") //流程實例Id
.orderByVariableName()
.desc() //根據變量名稱降序排序
.list();
list.forEach(h -> {
System.out.println("流程變量Id: " + h.getId());
System.out.println("流程實例Id: " + h.getProcessInstanceId());
System.out.println("變量名: " + h.getVariableName());
System.out.println("變量類型: " + h.getVariableTypeName());
System.out.println("變量值: " + h.getValue());
System.out.println("");
});
//流程變量Id: 120002
//流程實例Id: 120001
//變量名: assignee4
//變量類型: string
//變量值: 趙六
//...
}
```
**3. 歷史活動實例查詢:HistoricActivityInstance**
```java
@Test
public void historicActivityInstanceQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
.activityType("userTask") //活動節點類型
.processDefinitionId("evectionHistory:2:117504") //流程定義Id
.finished() //已經完成的節點
.orderByHistoricActivityInstanceEndTime()
.desc() //根據完成時間降序排序
.listPage(0, 10); //分頁查詢
list.forEach(h -> {
System.out.println("節點Id: " + h.getActivityId());
System.out.println("節點名稱: " + h.getActivityName());
System.out.println("節點類型: " + h.getActivityType());
System.out.println("節點負責人: " + h.getAssignee());
System.out.println("流程定義Id: " + h.getProcessDefinitionId());
System.out.println("流程實例Id: " + h.getProcessInstanceId());
System.out.println("任務Id: " + h.getTaskId());
System.out.println("該節點任務完成時間: " + h.getDurationInMillis() + "ms");
System.out.println("");
});
//節點Id: _6
//節點名稱: 財務審批
//節點類型: userTask
//節點負責人: 趙六
//流程定義Id: evectionHistory:2:117504
//流程實例Id: 120001
//任務Id: 127502
//該節點任務完成時間: 13696ms
//...
}
```
**4. 歷史詳情查詢:HistoricDetail**
```java
/**
* 歷史詳情查詢:HistoricVariableUpdate(歷史變量更新記錄)
*/
@Test
public void historicVariableUpdateQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricVariableUpdate> list = (List) historyService.createHistoricDetailQuery()
.variableUpdates()
.processInstanceId("120001")
.orderByTime()
.asc()
.list();
}
/**
* 歷史詳情查詢:HistoricFormProperties(歷史表單參數記錄)
*/
@Test
public void historicFormPropertiesQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricFormProperty> list = (List) historyService.createHistoricDetailQuery()
.formProperties()
.processInstanceId("120001")
.orderByVariableName().asc()
.list();
}
```
**5. 歷史任務實例查詢:HistoricTaskInstance**
```java
@Test
public void historicTaskInstanceQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.finished() //已完成的任務
.processInstanceId("120001") //流程實例Id
.includeProcessVariables() //包含全局流程變量
.includeTaskLocalVariables() //包含局部流程變量
.orderByHistoricTaskInstanceDuration()
.desc() //根據任務完成時間降序排序
.listPage(0, 10); //分頁查詢
list.forEach(h -> {
System.out.println("任務開始時間: " + h.getStartTime());
System.out.println("任務完成時間: " + h.getEndTime());
System.out.println("任務負責人: " + h.getAssignee());
System.out.println("流程定義Id: " + h.getProcessDefinitionId());
System.out.println("流程實例Id: " + h.getProcessInstanceId());
System.out.println("任務所在節點Id: " + h.getTaskDefinitionKey());
System.out.println("任務名稱: " + h.getName());
System.out.println("任務Id: " + h.getId());
System.out.println("全局變量: " + h.getProcessVariables());
System.out.println("局部變量: " + h.getTaskLocalVariables());
System.out.println("");
});
//任務開始時間: Tue Mar 01 21:08:25 CST 2022
//任務完成時間: Tue Mar 01 21:09:36 CST 2022
//任務負責人: 張三
//流程定義Id: evectionHistory:2:117504
//流程實例Id: 120001
//任務所在節點Id: _3
//任務名稱: 創建出差申請
//任務Id: 120009
//全局變量: {assignee4=趙六, assignee3=王五, assignee2=李四, assignee1=張三}
//局部變量: {}
//...
}
```
**6. 身份關聯信息查詢:HistoricIdentityLink**
```java
@Test
public void historicIdentityLinkQuery() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
//根據流程實例Id查詢
List<HistoricIdentityLink> list = historyService.getHistoricIdentityLinksForProcessInstance("120001");
list.forEach(h -> {
System.out.println("流程實例Id: " + h.getProcessInstanceId());
System.out.println("任務Id: " + h.getTaskId());
System.out.println("用戶: " + h.getUserId());
System.out.println("身份關聯類型: " + h.getType());
System.out.println("");
});
//流程實例Id: 120001
//任務Id: null
//用戶: 趙六
//身份關聯類型: participant
//...
}
```
****
參考文檔:https://tkjohn.github.io/flowable-userguide/#history
- Activiti流程引擎
- 工作流介紹
- Activiti是什么
- Activiti流程處理步驟
- Activiti環境搭建
- 搭建步驟
- 表結構介紹
- ActivitiAPI結構
- 認識流程符號
- 流程設計器的使用
- 流程處理步驟
- 亂碼問題
- 流程實例
- 流程實例是什么
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 個人任務
- 分配任務負責人
- 查詢待辦任務
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 使用流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 4種網關類型
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable與Activiti
- Flowable環境搭建
- FlowableAPI
- 流程引擎API與服務
- 流程處理步驟
- 流程部署
- 流程部署方式
- 流程定義版本
- 刪除已部署的流程
- 下載資源
- 流程實例
- 什么是流程實例
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 分配任務負責人
- 固定分配
- UEL表達式分配
- 監聽器分配
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- 歷史查詢
- 查詢歷史
- Spring整合Flowable
- 配置文件整合
- 配置類整合
- SpringBoot整合Flowable