1. 程式人生 > >Activiti入門教程十(詳解歷史服務元件HistoryService)

Activiti入門教程十(詳解歷史服務元件HistoryService)

               


     Activiti在刪除流程定義、刪除任務和刪除流程例項時,均會將刪除的資料儲存到歷史資料中,初次外,已經完成的流程例項以及相關資料,都會保持到歷史資料中,如果要對這些資料進行管理的話,就需要用到HistoryService元件了。


     正如上面所說,Activiti在整個流程執行過程中,會把所有相關的資訊,都想歷史表中儲存,因此HistoryService該元件的查詢方法特別的豐富,下面小編帶大家來見識一下吧!


     歷史流程例項查詢 

     使用HistoryService的createHistoricProcessInstanceQuery()方法就可以得到HistoricProcessInstanceQuery物件,該物件主要用於流程例項的歷史資料查詢。對於流程例項,不管流程是否完成,都會儲存到ACT_HI_PROCINST表中。

<span style="font-family:Comic Sans MS;font-size:18px;">public class ProcessInstanceQuery
public static void main(String[] args) throws Exception {  // 建立流程引擎  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  // 得到流程儲存服務例項  RepositoryService repositoryService = engine.getRepositoryService();  // 得到執行時服務元件  RuntimeService runtimeService = engine.getRuntimeService();  // 得到歷史服務元件
  HistoryService historyService = engine.getHistoryService();  // 部署流程檔案  Deployment deploy = repositoryService.createDeployment()    .addClasspathResource("bpmn/ProcessInstanceQuery.bpmn").deploy();  // 查詢流程定義     ProcessDefinition define = repositoryService      .createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();    // 開始流程    ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess", "businessKey1");    ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess", "businessKey2");    // 查詢執行流    Execution exe1 = runtimeService.createExecutionQuery()      .processInstanceId(pi1.getId()).singleResult();    Execution exe2 = runtimeService.createExecutionQuery()      .processInstanceId(pi2.getId()).singleResult();    // 完成第一條流程    runtimeService.signal(exe1.getId());    exe1 = runtimeService.createExecutionQuery()      .processInstanceId(pi1.getId()).singleResult();    runtimeService.signal(exe1.getId());    // 查詢已完成的流程    List<HistoricProcessInstance> datas = historyService      .createHistoricProcessInstanceQuery().finished().list();    System.out.println("使用finished方法:" + datas.size());    // 根據流程定義ID查詢    datas = historyService.createHistoricProcessInstanceQuery()      .processDefinitionId(define.getId()).list();    System.out.println("使用processDefinitionId方法: " + datas.size());    // 根據流程定義key(流程描述檔案的process節點id屬性)查詢    datas = historyService.createHistoricProcessInstanceQuery()      .processDefinitionKey(define.getKey()).list();    System.out.println("使用processDefinitionKey方法: " + datas.size());    // 根據業務主鍵查詢    datas = historyService.createHistoricProcessInstanceQuery()      .processInstanceBusinessKey("businessKey1").list();    System.out.println("使用processInstanceBusinessKey方法: " + datas.size());    // 根據流程例項ID查詢    datas = historyService.createHistoricProcessInstanceQuery()      .processInstanceId(pi1.getId()).list();    System.out.println("使用processInstanceId方法: " + datas.size());    // 查詢沒有完成的流程例項    historyService.createHistoricProcessInstanceQuery().unfinished().list();    System.out.println("使用unfinished方法: " + datas.size()); }}</span>



     歷史任務查詢

     通過HistoryService的createHistoricTaskInstanceQuery()方法,就可以得到HistoricTaskInstanceQuery物件,主要用來根據查詢條件,到歷史任務表ACT_HI_TASKINST中查詢符合條件的資料。

<span style="font-family:Comic Sans MS;font-size:18px;">public class TaskQuery public static void main(String[] args) throws Exception {  // 建立流程引擎  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  // 得到流程儲存服務例項  RepositoryService repositoryService = engine.getRepositoryService();  // 得到執行時服務元件  RuntimeService runtimeService = engine.getRuntimeService();  // 得到歷史服務元件  HistoryService historyService = engine.getHistoryService();  // 得到任務元件  TaskService taskService = engine.getTaskService();  // 部署流程檔案  Deployment deploy = repositoryService.createDeployment()    .addClasspathResource("bpmn/TaskQuery.bpmn").deploy();  ProcessDefinition define = repositoryService.createProcessDefinitionQuery()    .deploymentId(deploy.getId()).singleResult();  // 初始化引數  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  Map<String, Object> vars = new HashMap<String, Object>();  vars.put("varDate1", sdf.parseObject("2020-10-10 06:00:00"));  vars.put("varDate2", sdf.parseObject("2021-10-10 06:00:00"));  //開始流程  ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess",     "businessKey1", vars);  ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess",     "businessKey2", vars);  //完成流程1  Execution exe1 = runtimeService.createExecutionQuery().processInstanceId(pi1.getId())    .singleResult();  runtimeService.signal(exe1.getId());  exe1 = runtimeService.createExecutionQuery().processInstanceId(pi1.getId())    .singleResult();  runtimeService.signal(exe1.getId());  // 流程2完成一個任務  List<Task> tasks = taskService.createTaskQuery().processInstanceId(pi2.getId()).list();  for (Task task : tasks) {   taskService.complete(task.getId());  }  //歷史資料查詢  List<HistoricTaskInstance> datas = historyService.createHistoricTaskInstanceQuery()    .finished().list();  System.out.println("使用finished方法查詢:" + datas.size());//結果3  datas = historyService.createHistoricTaskInstanceQuery()    .processDefinitionId(define.getId()).list();  System.out.println("使用processDefinitionId方法查詢:" + datas.size());//結果4  datas = historyService.createHistoricTaskInstanceQuery()    .processDefinitionKey("testProcess").list();  System.out.println("使用processDefinitionKey方法查詢:" + datas.size());//結果4  datas = historyService.createHistoricTaskInstanceQuery()    .processDefinitionName("testProcess2").list();  System.out.println("使用processDefinitionName方法查詢:" + datas.size());//結果4  datas = historyService.createHistoricTaskInstanceQuery()    .processFinished().list();  System.out.println("使用processFinished方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricTaskInstanceQuery()    .processInstanceId(pi2.getId()).list();  System.out.println("使用processInstanceId方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricTaskInstanceQuery()    .processUnfinished().list();  System.out.println("使用processUnfinished方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricTaskInstanceQuery()    .taskAssignee("crazyit").list();  System.out.println("使用taskAssignee方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricTaskInstanceQuery()    .taskAssigneeLike("%zy%").list();  System.out.println("使用taskAssigneeLike方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricTaskInstanceQuery()    .taskDefinitionKey("usertask1").list();  System.out.println("使用taskDefinitionKey方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricTaskInstanceQuery()    .taskDueAfter(sdf.parse("2020-10-11 06:00:00")).list();  System.out.println("使用taskDueAfter方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricTaskInstanceQuery()    .taskDueBefore(sdf.parse("2022-10-11 06:00:00")).list();  System.out.println("使用taskDueBefore方法查詢:" + datas.size());//結果4  datas = historyService.createHistoricTaskInstanceQuery()    .taskDueDate(sdf.parse("2020-10-11 06:00:00")).list();  System.out.println("使用taskDueDate方法查詢:" + datas.size());//結果0  datas = historyService.createHistoricTaskInstanceQuery()    .unfinished().list();  System.out.println("使用unfinished方法查詢:" + datas.size());//結果1 }}</span>





     歷史行為查詢

     流程在進行過程中,每每走一個節點,都會記錄流程節點的資訊,包括節點的id,名稱、型別、時間等,儲存到ACT_HI_ACTINST表中。

<span style="font-family:Comic Sans MS;font-size:18px;">public class ActivityQuery public static void main(String[] args) {  // 建立流程引擎  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  // 得到流程儲存服務例項  RepositoryService repositoryService = engine.getRepositoryService();  // 得到執行時服務元件  RuntimeService runtimeService = engine.getRuntimeService();  // 得到歷史服務元件  HistoryService historyService = engine.getHistoryService();  // 任務元件  TaskService taskService = engine.getTaskService();  // 部署流程檔案  repositoryService.createDeployment()    .addClasspathResource("bpmn/ActivityQuery.bpmn").deploy();     // 開始兩條流程  ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess");  ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess");  // 結束第一個流程例項  Execution exe = runtimeService.createExecutionQuery()    .processInstanceId(pi1.getId()).singleResult();  runtimeService.signal(exe.getId());  runtimeService.signalEventReceived("mySignal");  // 第二個流程例項完成第一個任務  Task task = taskService.createTaskQuery().processInstanceId(pi2.getId()).singleResult();  taskService.complete(task.getId());   //查詢資料  List<HistoricActivityInstance> datas = historyService.createHistoricActivityInstanceQuery()    .activityId("endevent1").list();  System.out.println("使用activityId查詢:" + datas.size());//結果1  datas = historyService.createHistoricActivityInstanceQuery()    .activityInstanceId(datas.get(0).getId()).list();  System.out.println("使用activityInstanceId查詢:" + datas.size());//結果1  datas = historyService.createHistoricActivityInstanceQuery()    .activityType("intermediateSignalCatch").list();  System.out.println("使用activityType查詢:" + datas.size());//結果2  datas = historyService.createHistoricActivityInstanceQuery()    .executionId(exe.getId()).list();  System.out.println("使用executionId查詢:" + datas.size());//結果3  datas = historyService.createHistoricActivityInstanceQuery().finished().list();  System.out.println("使用finished查詢:" + datas.size());//結果6  datas = historyService.createHistoricActivityInstanceQuery()    .processInstanceId(pi2.getId()).list();  System.out.println("使用processInstanceId查詢:" + datas.size());//結果3  datas = historyService.createHistoricActivityInstanceQuery()    .taskAssignee("crazyit").list();  System.out.println("使用taskAssignee查詢:" + datas.size());//結果2  datas = historyService.createHistoricActivityInstanceQuery().unfinished().list();  System.out.println("使用unfinished查詢:" + datas.size());//結果1 }}</span>


歷史流程明細查詢

在流程進行的過程中,會產生許多明細資料,只有將History設定為最高級別的時候,才會被記錄到ACT_HI_DETAIL表中。

<span style="font-family:Comic Sans MS;font-size:18px;">public class DetailQuery public static void main(String[] args) {  // 建立流程引擎  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  // 得到流程儲存服務例項  RepositoryService repositoryService = engine.getRepositoryService();  // 得到執行時服務元件  RuntimeService runtimeService = engine.getRuntimeService();  // 得到歷史服務元件  HistoryService historyService = engine.getHistoryService();  // 得到任務元件  TaskService taskService = engine.getTaskService();  // 部署流程檔案  repositoryService.createDeployment()   .addClasspathResource("bpmn/DetailQuery.bpmn").deploy();  // 初始化引數  Map<String, Object> vars = new HashMap<String, Object>();  vars.put("days", 10);  //  開始流程  ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess", vars);  ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess", vars);  // 完成第一個流程   Execution exe = runtimeService.createExecutionQuery()    .processInstanceId(pi1.getId()).singleResult();  Task task = taskService.createTaskQuery().executionId(exe.getId()).singleResult();  taskService.complete(task.getId(), vars);  exe = runtimeService.createExecutionQuery().processInstanceId(pi1.getId()).singleResult();  runtimeService.signal(exe.getId());  // 為第二個流程的第一個任務設定引數  exe = runtimeService.createExecutionQuery().processInstanceId(pi2.getId()).singleResult();  task = taskService.createTaskQuery().executionId(exe.getId()).singleResult();  taskService.setVariableLocal(task.getId(), "name", "crazyit");  // 查詢歷史行為  HistoricActivityInstance act = historyService.createHistoricActivityInstanceQuery()    .activityName("First Task").finished().singleResult();  List<HistoricDetail> datas = historyService.createHistoricDetailQuery()    .activityInstanceId(act.getId()).list();  System.out.println("使用activityInstanceId方法查詢:" + datas.size());//結果1  datas = historyService.createHistoricDetailQuery().excludeTaskDetails().list();  System.out.println("使用excludeTaskDetails方法查詢:" + datas.size());//結果3  datas = historyService.createHistoricDetailQuery().formProperties().list();  System.out.println("使用formProperties方法查詢:" + datas.size());//結果0  datas = historyService.createHistoricDetailQuery().processInstanceId(pi1.getId()).list();  System.out.println("使用processInstanceId方法查詢:" + datas.size());//結果2  datas = historyService.createHistoricDetailQuery().taskId(task.getId()).list();  System.out.println("使用taskId方法查詢:" + datas.size());//結果1  datas = historyService.createHistoricDetailQuery().variableUpdates().list();  System.out.println("使用variableUpdates方法查詢:" + datas.size());//結果4 }}</span>



           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow