Activiti入门教程十(详解历史服务组件HistoryService)

来源:互联网 发布:米兔积木机器人 编程 编辑:程序博客网 时间:2024/05/21 09:12

Activiti入门教程十(详解历史服务组件HistoryService)

3812人阅读 评论(9)收藏举报
本文章已收录于:
Java 知识库
分类:
作者同类文章X
  • Dubbo源码分析(TimeoutFilter、ExceptionFilter、TokenFilter)
  • Dubbo源码分析(AccessLogFilter)
  • Dubbo源码分析(Filter)
  • 操作系统知识点汇总
  • Netty学习笔记—helloWorld
  • 更多


     Activiti在删除流程定义、删除任务和删除流程实例时,均会将删除的数据保存到历史数据中,初次外,已经完成的流程实例以及相关数据,都会保持到历史数据中,如果要对这些数据进行管理的话,就需要用到HistoryService组件了。


     正如上面所说,Activiti在整个流程执行过程中,会把所有相关的信息,都想历史表中保存,因此HistoryService该组件的查询方法特别的丰富,下面小编带大家来见识一下吧!


     历史流程实例查询 

     使用HistoryService的createHistoricProcessInstanceQuery()方法就可以得到HistoricProcessInstanceQuery对象,该对象主要用于流程实例的历史数据查询。对于流程实例,不管流程是否完成,都会保存到ACT_HI_PROCINST表中。

[java] view plain copy
print?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">public class ProcessInstanceQuery {  
  2.   
  3.     public static void main(String[] args) throws Exception {  
  4.         // 创建流程引擎  
  5.         ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  
  6.         // 得到流程存储服务实例  
  7.         RepositoryService repositoryService = engine.getRepositoryService();  
  8.         // 得到运行时服务组件  
  9.         RuntimeService runtimeService = engine.getRuntimeService();  
  10.         // 得到历史服务组件  
  11.         HistoryService historyService = engine.getHistoryService();  
  12.         // 部署流程文件  
  13.         Deployment deploy = repositoryService.createDeployment()  
  14.                 .addClasspathResource("bpmn/ProcessInstanceQuery.bpmn").deploy();  
  15.         // 查询流程定义   
  16.                 ProcessDefinition define = repositoryService  
  17.                         .createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();  
  18.                 // 开始流程  
  19.                 ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess""businessKey1");  
  20.                 ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess""businessKey2");  
  21.                 // 查询执行流  
  22.                 Execution exe1 = runtimeService.createExecutionQuery()  
  23.                         .processInstanceId(pi1.getId()).singleResult();  
  24.                 Execution exe2 = runtimeService.createExecutionQuery()  
  25.                         .processInstanceId(pi2.getId()).singleResult();  
  26.                 // 完成第一条流程  
  27.                 runtimeService.signal(exe1.getId());  
  28.                 exe1 = runtimeService.createExecutionQuery()  
  29.                         .processInstanceId(pi1.getId()).singleResult();  
  30.                 runtimeService.signal(exe1.getId());  
  31.                 // 查询已完成的流程  
  32.                 List<HistoricProcessInstance> datas = historyService  
  33.                         .createHistoricProcessInstanceQuery().finished().list();  
  34.                 System.out.println("使用finished方法:" + datas.size());  
  35.                 // 根据流程定义ID查询  
  36.                 datas = historyService.createHistoricProcessInstanceQuery()  
  37.                         .processDefinitionId(define.getId()).list();  
  38.                 System.out.println("使用processDefinitionId方法: " + datas.size());  
  39.                 // 根据流程定义key(流程描述文件的process节点id属性)查询  
  40.                 datas = historyService.createHistoricProcessInstanceQuery()  
  41.                         .processDefinitionKey(define.getKey()).list();  
  42.                 System.out.println("使用processDefinitionKey方法: " + datas.size());  
  43.                 // 根据业务主键查询  
  44.                 datas = historyService.createHistoricProcessInstanceQuery()  
  45.                         .processInstanceBusinessKey("businessKey1").list();  
  46.                 System.out.println("使用processInstanceBusinessKey方法: " + datas.size());  
  47.                 // 根据流程实例ID查询  
  48.                 datas = historyService.createHistoricProcessInstanceQuery()  
  49.                         .processInstanceId(pi1.getId()).list();  
  50.                 System.out.println("使用processInstanceId方法: " + datas.size());  
  51.                 // 查询没有完成的流程实例  
  52.                 historyService.createHistoricProcessInstanceQuery().unfinished().list();  
  53.                 System.out.println("使用unfinished方法: " + datas.size());  
  54.     }  
  55. }  
  56. </span>  



     历史任务查询

     通过HistoryService的createHistoricTaskInstanceQuery()方法,就可以得到HistoricTaskInstanceQuery对象,主要用来根据查询条件,到历史任务表ACT_HI_TASKINST中查询符合条件的数据。

[java] view plain copy
print?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">public class TaskQuery {  
  2.   
  3.     public static void main(String[] args) throws Exception {  
  4.         // 创建流程引擎  
  5.         ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  
  6.         // 得到流程存储服务实例  
  7.         RepositoryService repositoryService = engine.getRepositoryService();  
  8.         // 得到运行时服务组件  
  9.         RuntimeService runtimeService = engine.getRuntimeService();  
  10.         // 得到历史服务组件  
  11.         HistoryService historyService = engine.getHistoryService();  
  12.         // 得到任务组件  
  13.         TaskService taskService = engine.getTaskService();  
  14.         // 部署流程文件  
  15.         Deployment deploy = repositoryService.createDeployment()  
  16.                 .addClasspathResource("bpmn/TaskQuery.bpmn").deploy();  
  17.         ProcessDefinition define = repositoryService.createProcessDefinitionQuery()  
  18.                 .deploymentId(deploy.getId()).singleResult();  
  19.         // 初始化参数  
  20.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  21.         Map<String, Object> vars = new HashMap<String, Object>();  
  22.         vars.put("varDate1", sdf.parseObject("2020-10-10 06:00:00"));  
  23.         vars.put("varDate2", sdf.parseObject("2021-10-10 06:00:00"));  
  24.         //开始流程  
  25.         ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess",   
  26.                 "businessKey1", vars);  
  27.         ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess",   
  28.                 "businessKey2", vars);  
  29.         //完成流程1  
  30.         Execution exe1 = runtimeService.createExecutionQuery().processInstanceId(pi1.getId())  
  31.                 .singleResult();  
  32.         runtimeService.signal(exe1.getId());  
  33.         exe1 = runtimeService.createExecutionQuery().processInstanceId(pi1.getId())  
  34.                 .singleResult();  
  35.         runtimeService.signal(exe1.getId());  
  36.         // 流程2完成一个任务  
  37.         List<Task> tasks = taskService.createTaskQuery().processInstanceId(pi2.getId()).list();  
  38.         for (Task task : tasks) {  
  39.             taskService.complete(task.getId());  
  40.         }  
  41.         //历史数据查询  
  42.         List<HistoricTaskInstance> datas = historyService.createHistoricTaskInstanceQuery()  
  43.                 .finished().list();  
  44.         System.out.println("使用finished方法查询:" + datas.size());//结果3  
  45.         datas = historyService.createHistoricTaskInstanceQuery()  
  46.                 .processDefinitionId(define.getId()).list();  
  47.         System.out.println("使用processDefinitionId方法查询:" + datas.size());//结果4  
  48.         datas = historyService.createHistoricTaskInstanceQuery()  
  49.                 .processDefinitionKey("testProcess").list();  
  50.         System.out.println("使用processDefinitionKey方法查询:" + datas.size());//结果4  
  51.         datas = historyService.createHistoricTaskInstanceQuery()  
  52.                 .processDefinitionName("testProcess2").list();  
  53.         System.out.println("使用processDefinitionName方法查询:" + datas.size());//结果4  
  54.         datas = historyService.createHistoricTaskInstanceQuery()  
  55.                 .processFinished().list();  
  56.         System.out.println("使用processFinished方法查询:" + datas.size());//结果2  
  57.         datas = historyService.createHistoricTaskInstanceQuery()  
  58.                 .processInstanceId(pi2.getId()).list();  
  59.         System.out.println("使用processInstanceId方法查询:" + datas.size());//结果2  
  60.         datas = historyService.createHistoricTaskInstanceQuery()  
  61.                 .processUnfinished().list();  
  62.         System.out.println("使用processUnfinished方法查询:" + datas.size());//结果2  
  63.         datas = historyService.createHistoricTaskInstanceQuery()  
  64.                 .taskAssignee("crazyit").list();  
  65.         System.out.println("使用taskAssignee方法查询:" + datas.size());//结果2  
  66.         datas = historyService.createHistoricTaskInstanceQuery()  
  67.                 .taskAssigneeLike("%zy%").list();  
  68.         System.out.println("使用taskAssigneeLike方法查询:" + datas.size());//结果2  
  69.         datas = historyService.createHistoricTaskInstanceQuery()  
  70.                 .taskDefinitionKey("usertask1").list();  
  71.         System.out.println("使用taskDefinitionKey方法查询:" + datas.size());//结果2  
  72.         datas = historyService.createHistoricTaskInstanceQuery()  
  73.                 .taskDueAfter(sdf.parse("2020-10-11 06:00:00")).list();  
  74.         System.out.println("使用taskDueAfter方法查询:" + datas.size());//结果2  
  75.         datas = historyService.createHistoricTaskInstanceQuery()  
  76.                 .taskDueBefore(sdf.parse("2022-10-11 06:00:00")).list();  
  77.         System.out.println("使用taskDueBefore方法查询:" + datas.size());//结果4  
  78.         datas = historyService.createHistoricTaskInstanceQuery()  
  79.                 .taskDueDate(sdf.parse("2020-10-11 06:00:00")).list();  
  80.         System.out.println("使用taskDueDate方法查询:" + datas.size());//结果0  
  81.         datas = historyService.createHistoricTaskInstanceQuery()  
  82.                 .unfinished().list();  
  83.         System.out.println("使用unfinished方法查询:" + datas.size());//结果1  
  84.     }  
  85.   
  86. }</span>  





     历史行为查询

     流程在进行过程中,每每走一个节点,都会记录流程节点的信息,包括节点的id,名称、类型、时间等,保存到ACT_HI_ACTINST表中。

[java] view plain copy
print?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">public class ActivityQuery {  
  2.   
  3.   
  4.     public static void main(String[] args) {  
  5.         // 创建流程引擎  
  6.         ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  
  7.         // 得到流程存储服务实例  
  8.         RepositoryService repositoryService = engine.getRepositoryService();  
  9.         // 得到运行时服务组件  
  10.         RuntimeService runtimeService = engine.getRuntimeService();  
  11.         // 得到历史服务组件  
  12.         HistoryService historyService = engine.getHistoryService();  
  13.         // 任务组件  
  14.         TaskService taskService = engine.getTaskService();  
  15.         // 部署流程文件  
  16.         repositoryService.createDeployment()  
  17.                 .addClasspathResource("bpmn/ActivityQuery.bpmn").deploy();            
  18.         // 开始两条流程  
  19.         ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess");  
  20.         ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess");  
  21.         // 结束第一个流程实例  
  22.         Execution exe = runtimeService.createExecutionQuery()  
  23.                 .processInstanceId(pi1.getId()).singleResult();  
  24.         runtimeService.signal(exe.getId());  
  25.         runtimeService.signalEventReceived("mySignal");  
  26.         // 第二个流程实例完成第一个任务  
  27.         Task task = taskService.createTaskQuery().processInstanceId(pi2.getId()).singleResult();  
  28.         taskService.complete(task.getId());   
  29.         //查询数据  
  30.         List<HistoricActivityInstance> datas = historyService.createHistoricActivityInstanceQuery()  
  31.                 .activityId("endevent1").list();  
  32.         System.out.println("使用activityId查询:" + datas.size());//结果1  
  33.         datas = historyService.createHistoricActivityInstanceQuery()  
  34.                 .activityInstanceId(datas.get(0).getId()).list();  
  35.         System.out.println("使用activityInstanceId查询:" + datas.size());//结果1  
  36.         datas = historyService.createHistoricActivityInstanceQuery()  
  37.                 .activityType("intermediateSignalCatch").list();  
  38.         System.out.println("使用activityType查询:" + datas.size());//结果2  
  39.         datas = historyService.createHistoricActivityInstanceQuery()  
  40.                 .executionId(exe.getId()).list();  
  41.         System.out.println("使用executionId查询:" + datas.size());//结果3  
  42.         datas = historyService.createHistoricActivityInstanceQuery().finished().list();  
  43.         System.out.println("使用finished查询:" + datas.size());//结果6  
  44.         datas = historyService.createHistoricActivityInstanceQuery()  
  45.                 .processInstanceId(pi2.getId()).list();  
  46.         System.out.println("使用processInstanceId查询:" + datas.size());//结果3  
  47.         datas = historyService.createHistoricActivityInstanceQuery()  
  48.                 .taskAssignee("crazyit").list();  
  49.         System.out.println("使用taskAssignee查询:" + datas.size());//结果2  
  50.         datas = historyService.createHistoricActivityInstanceQuery().unfinished().list();  
  51.         System.out.println("使用unfinished查询:" + datas.size());//结果1  
  52.     }  
  53.   
  54. }  
  55. </span>  


历史流程明细查询

在流程进行的过程中,会产生许多明细数据,只有将History设置为最高级别的时候,才会被记录到ACT_HI_DETAIL表中。

[java] view plain copy
print?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">public class DetailQuery {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // 创建流程引擎  
  5.         ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();  
  6.         // 得到流程存储服务实例  
  7.         RepositoryService repositoryService = engine.getRepositoryService();  
  8.         // 得到运行时服务组件  
  9.         RuntimeService runtimeService = engine.getRuntimeService();  
  10.         // 得到历史服务组件  
  11.         HistoryService historyService = engine.getHistoryService();  
  12.         // 得到任务组件  
  13.         TaskService taskService = engine.getTaskService();  
  14.         // 部署流程文件  
  15.         repositoryService.createDeployment()  
  16.             .addClasspathResource("bpmn/DetailQuery.bpmn").deploy();  
  17.         // 初始化参数  
  18.         Map<String, Object> vars = new HashMap<String, Object>();  
  19.         vars.put("days"10);  
  20.         //  开始流程  
  21.         ProcessInstance pi1 = runtimeService.startProcessInstanceByKey("testProcess", vars);  
  22.         ProcessInstance pi2 = runtimeService.startProcessInstanceByKey("testProcess", vars);  
  23.         // 完成第一个流程   
  24.         Execution exe = runtimeService.createExecutionQuery()  
  25.                 .processInstanceId(pi1.getId()).singleResult();  
  26.         Task task = taskService.createTaskQuery().executionId(exe.getId()).singleResult();  
  27.         taskService.complete(task.getId(), vars);  
  28.         exe = runtimeService.createExecutionQuery().processInstanceId(pi1.getId()).singleResult();  
  29.         runtimeService.signal(exe.getId());  
  30.         // 为第二个流程的第一个任务设置参数  
  31.         exe = runtimeService.createExecutionQuery().processInstanceId(pi2.getId()).singleResult();  
  32.         task = taskService.createTaskQuery().executionId(exe.getId()).singleResult();  
  33.         taskService.setVariableLocal(task.getId(), "name""crazyit");  
  34.         // 查询历史行为  
  35.         HistoricActivityInstance act = historyService.createHistoricActivityInstanceQuery()  
  36.                 .activityName("First Task").finished().singleResult();  
  37.         List<HistoricDetail> datas = historyService.createHistoricDetailQuery()  
  38.                 .activityInstanceId(act.getId()).list();  
  39.         System.out.println("使用activityInstanceId方法查询:" + datas.size());//结果1  
  40.         datas = historyService.createHistoricDetailQuery().excludeTaskDetails().list();  
  41.         System.out.println("使用excludeTaskDetails方法查询:" + datas.size());//结果3  
  42.         datas = historyService.createHistoricDetailQuery().formProperties().list();  
  43.         System.out.println("使用formProperties方法查询:" + datas.size());//结果0  
  44.         datas = historyService.createHistoricDetailQuery().processInstanceId(pi1.getId()).list();  
  45.         System.out.println("使用processInstanceId方法查询:" + datas.size());//结果2  
  46.         datas = historyService.createHistoricDetailQuery().taskId(task.getId()).list();  
  47.         System.out.println("使用taskId方法查询:" + datas.size());//结果1  
  48.         datas = historyService.createHistoricDetailQuery().variableUpdates().list();  
  49.         System.out.println("使用variableUpdates方法查询:" + datas.size());//结果4  
  50.     }  
  51.   
  52. }  
  53. </span>  



0
0
 
 

  相关文章推荐
  • Activiti入门教程十一(来杯流程喝喝吧)
  • jBPM4.4:HistoryService历史服务
  • Activiti入门教程五(详解ProcessEngine的创建)
  • HTML5历史与开发介绍-HTML5 入门教程
  • Activiti入门教程三(详解流程引擎配置)
  • Java API——RMIIO入门教程(2)远程流传输示例之RMIIO服务源码
  • Activiti入门教程六(详解Activiti中的查询API)
  • Flex 3入门教程: 在 MXML 中构建自定义组件
  • Google Guice 入门教程08 - 整合第三方组件(2)
  • Activiti入门教程八(玩转Task任务API)
原创粉丝点击