讓Activiti記錄變量歷史信息

可能你在苦惱這個問題,由於在跟蹤已結束流程的時候須要獲取流程辦理中設置的變量值(能夠分析每一個節點辦理的詳細狀態),今天咱們就來探索一下如何實現。html

1.Activiti表結構設計

Activiti的表結構設計分爲兩種類型:運行時(ACT_RU)、歷史(ACT_HI)。java

1.1 運行時變量

全部運行時的變量都保存在表:ACT_RU_VARIABLE中,這些變量能夠在啓動流程、完成任務、動態添加的方式插入到數據庫,以便流程在處理中能夠根據變量的值決定流程的走向。web

1.2 歷史變量呢?

爲何沒有ACT_HI_VARIABLE這張表呢?spring

我在開始的時候也是苦惱爲何沒有這張表,致使在跟蹤歷史流程信息的時候不能獲取變量。數據庫

2.瞭解歷史級別

Activit默認提供了4中歷史級別:性能

  • none: 不保存任何歷史記錄,能夠提升系統性能;ui

  • activity:保存全部的流程實例、任務、活動信息;spa

  • audit:也是Activiti的默認級別,保存全部的流程實例、任務、活動、表單屬性;設計

  • full: 最完整的歷史記錄,除了包含audit級別的信息以外還能保存詳細,例如:流程變量。code

對於幾種級別根據對功能的要求選擇,若是須要往後跟蹤詳細能夠開啓full

3.配置歷史級別

3.1 在XML中配置

在引擎BeanprocessEngineConfiguration中配置:

 <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    <property name="history" value="full">
</property></bean>

3.2 動態配置

ProcessEngine processEngine = ProcessEngineConfiguration
  .createProcessEngineConfigurationFromResourceDefault()
  .setHistory("full")
  .buildProcessEngine();

4.讀取歷史變量

如今再重啓你的應用,啓動流程或者在任務complete以後查看ACT_HI_DETAIL表的數據已經記錄了。

開始full歷史級別後保存的歷史信息

4.1 Java代碼-5.10版本以前

List<HistoricDetail> list = historyService.createHistoricDetailQuery().processInstanceId(processInstance.getId()).list();
for (HistoricDetail historicDetail : list) {
    HistoricVariableUpdate variable = (HistoricVariableUpdate) historicDetail;
    System.out.println("variable: " + variable.getVariableName() + " = " + variable.getValue());
}

4.2 Java代碼-5.11版本以後

5.11版本在變量保存方面作了變更,單首創建了一張表ACT_HI_VARINST保存變量,能夠經過下面的代碼讀取變量。參見:Activiti 5.11發佈

5.11添加的表ACT_HI_VARINST

List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).list();
for (HistoricVariableInstance variable : list) {
  System.out.println("variable: " + variable.getVariableName() + " = " + variable.getValue());
}

5.只讀取表單字段

List<HistoricDetail> formProperties = historyService.createHistoricDetailQuery().processInstanceId(processInstance.getId()).formProperties().list();
for (HistoricDetail historicDetail : formProperties) {
  HistoricFormProperty field = (HistoricFormProperty) historicDetail;
  System.out.println("field id: " + field.getPropertyId() + ", value: " + field.getPropertyValue());
}
相關文章
相關標籤/搜索