博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activiti基础教程--07流程执行历史记录(历史任务、历史流程实例、历史活动)...
阅读量:5901 次
发布时间:2019-06-19

本文共 5031 字,大约阅读时间需要 16 分钟。

hot3.png

相关代码参考gihub:

一、Activiti 历史任务查询

 

实际工作流项目中,有一个功能叫做 历史任务查询。某一次流程的执行一共经历了多少个任务.我们其实查询的是历史任务实例表;

bb.jpg

    当然这个表的话,不管是已经完结的任务 还是正在执行的任务,都会记录下这个表里。Activiti给我们提供了一个接口 finished;加了之后 就是查询已经完结的任务; 同理还有一个接口unfinished 顾名思义,就是查询未完结的任务;当然这两个都不加,就是把所有任务都查询出来;

OK我们上代码:

[java]  

 

  1. /** 
  2.  * 历史任务查询 
  3.  */  
  4.   
  5. public void historyTaskList(){  
  6.     List<HistoricTaskInstance> list=processEngine.getHistoryService() // 历史任务Service  
  7.             .createHistoricTaskInstanceQuery() // 创建历史任务实例查询  
  8.             .taskAssignee("java1234_小锋") // 指定办理人  
  9.             .finished() // 查询已经完成的任务    
  10.             .list();  
  11.     for(HistoricTaskInstance hti:list){  
  12.         System.out.println("任务ID:"+hti.getId());  
  13.         System.out.println("流程实例ID:"+hti.getProcessInstanceId());  
  14.         System.out.println("班里人:"+hti.getAssignee());  
  15.         System.out.println("创建时间:"+hti.getCreateTime());  
  16.         System.out.println("结束时间:"+hti.getEndTime());  
  17.         System.out.println("===========================");  
  18.     }  
  19. }  

 

[java]  

 

  1. /**查询历史任务*/  
  2.   
  3. public void findHistoryTask(){  
  4.     String processInstanceId = "2101";  
  5.     List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的Service  
  6.                     .createHistoricTaskInstanceQuery()//创建历史任务实例查询  
  7.                     .processInstanceId(processInstanceId)//  
  8.                     .orderByHistoricTaskInstanceStartTime().asc()  
  9.                     .list();  
  10.     if(list!=null && list.size()>0){  
  11.         for(HistoricTaskInstance hti:list){  
  12.             System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());  
  13.             System.out.println("################################");  
  14.         }  
  15.     }  
  16. }  

 

二、Activiti 查询历史流程实例

 

开发中 有时候我们也需要通过流程实例ID来查询历史流程实例。其实本质就是查询历史流程实例表;

cc.jpg

这里有一点说下 这个表的id和流程实例id始终是一样的。所以Activiti没有提供获取流程实例id的接口;因为直接getId()获取的值和流程实例Id是一样的;

[java]  

 

  1. /** 
  2.  * 查询历史流程实例 
  3.  */  
  4.   
  5. public void getHistoryProcessInstance(){  
  6.     HistoricProcessInstance hpi= processEngine.getHistoryService() // 历史任务Service  
  7.         .createHistoricProcessInstanceQuery() // 创建历史流程实例查询  
  8.         .processInstanceId("2501") // 指定流程实例ID  
  9.         .singleResult();  
  10.     System.out.println("流程实例ID:"+hpi.getId());  
  11.     System.out.println("创建时间:"+hpi.getStartTime());  
  12.     System.out.println("结束时间:"+hpi.getEndTime());  
  13. }  

三、Activiti历史活动查询

 

在流程系统开发中,我们有这样一种需求,当流程实例完成后,我们要查下流程活动具体的执行情况,比如这个流程实例什么时候开始的,什么时候结束的,以及中间具体的执行步骤,这时候,我们需要查询历史流程活动执行表,act_hi_actinst

QQ鎴浘20160630103307.jpg

比如上面这个流程;Activiti提供了丰富的接口让我们查询历史活动,上代码:

 

[java]  

 

  1. /** 
  2.      * 历史活动查询 
  3.      */  
  4.       
  5.     public void historyActInstanceList(){  
  6.         List<HistoricActivityInstance> list=processEngine.getHistoryService() // 历史任务Service  
  7.                 .createHistoricActivityInstanceQuery() // 创建历史活动实例查询  
  8.                 .processInstanceId("27501") // 指定流程实例id  
  9.                 .finished() // 查询已经完成的任务    
  10.                 .list();  
  11.         for(HistoricActivityInstance hai:list){  
  12.             System.out.println("任务ID:"+hai.getId());  
  13.             System.out.println("流程实例ID:"+hai.getProcessInstanceId());  
  14.             System.out.println("活动名称:"+hai.getActivityName());  
  15.             System.out.println("办理人:"+hai.getAssignee());  
  16.             System.out.println("开始时间:"+hai.getStartTime());  
  17.             System.out.println("结束时间:"+hai.getEndTime());  
  18.             System.out.println("===========================");  
  19.         }  
  20.     }  
执行结果:
任务ID:27502
流程实例ID:27501
活动名称:Start
办理人:null
开始时间:Thu Jun 30 10:13:20 CST 2016
结束时间:Thu Jun 30 10:13:20 CST 2016
===========================
任务ID:27503
流程实例ID:27501
活动名称:学生请假申请
办理人:张三
开始时间:Thu Jun 30 10:13:20 CST 2016
结束时间:Thu Jun 30 10:16:13 CST 2016
===========================
任务ID:30001
流程实例ID:27501
活动名称:班长审批
办理人:李四
开始时间:Thu Jun 30 10:16:13 CST 2016
结束时间:Thu Jun 30 10:16:36 CST 2016
===========================
任务ID:32501
流程实例ID:27501
活动名称:班主任审批
办理人:王五
开始时间:Thu Jun 30 10:16:36 CST 2016
结束时间:Thu Jun 30 10:16:57 CST 2016
===========================
任务ID:35001
流程实例ID:27501
活动名称:End
办理人:null
开始时间:Thu Jun 30 10:16:57 CST 2016
结束时间:Thu Jun 30 10:16:57 CST 2016
 

===========================

[java]  

 

  1. /**查询历史活动-->某一次流程的执行一共经历了多少个活动*/  
  2.   
  3. public void findHistoryActiviti(){  
  4.     String processInstanceId = "1701";  
  5.     List<HistoricActivityInstance> list = processEngine.getHistoryService()//  
  6.                     .createHistoricActivityInstanceQuery()//创建历史活动实例的查询  
  7.                     .processInstanceId(processInstanceId)//  
  8.                     .orderByHistoricActivityInstanceStartTime().asc()//  
  9.                     .list();  
  10.     if(list!=null && list.size()>0){  
  11.         for(HistoricActivityInstance hai:list){  
  12.             System.out.println(hai.getId()+"   "+hai.getProcessInstanceId()+"   "+hai.getActivityType()+"  "+hai.getStartTime()+"   "+hai.getEndTime()+"   "+hai.getDurationInMillis());  
  13.             System.out.println("#####################");  
  14.         }  
  15.     }  
  16. }  

四、查询历史流程变量

  某一次流程的执行一共设置的流程变量

[java]  

 

  1. /**查询历史流程变量*/  
  2. @Test  
  3. public void findHistoryProcessVariables(){  
  4.     String processInstanceId = "2101";  
  5.     List<HistoricVariableInstance> list = processEngine.getHistoryService()//  
  6.                     .createHistoricVariableInstanceQuery()//创建一个历史的流程变量查询对象  
  7.                     .processInstanceId(processInstanceId)//  
  8.                     .list();  
  9.     if(list!=null && list.size()>0){  
  10.         for(HistoricVariableInstance hvi:list){  
  11.             System.out.println(hvi.getId()+"   "+hvi.getProcessInstanceId()+"   "+hvi.getVariableName()+"   "+hvi.getVariableTypeName()+"    "+hvi.getValue());  
  12.             System.out.println("###############################################");  
  13.         }  
  14.     }  
  15. }  

总结
    由于数据库中保存着历史信息以及正在运行的流程实例信息,在实际项目中对已完成任务的查看频率远不及对代办和可接任务的查看,所以在activiti采用分开管理,把正在运行的交给RuntimeService、TaskService管理,而历史数据交给HistoryService来管理。
    这样做的好处在于,加快流程执行的速度,因为正在执行的流程的表中数据不会很大

 

 

 

文章转自《http://blog.csdn.net/ochangwen/article/details/51910695》,感谢作者分享!

转载于:https://my.oschina.net/xiaominmin/blog/1821902

你可能感兴趣的文章
微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程
查看>>
【转】C++ 笔试面试题目
查看>>
同步和异步的区别
查看>>
[Leetcode] Search in Rotated Sorted Array
查看>>
委托、Lambda表达式、事件系列02,什么时候该用委托
查看>>
在ASP.NET MVC控制器中获取链接中的路由数据
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
LightOJ 1274 Beating the Dataset(期望)
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
多线程一个错误的例子
查看>>
默认网关及route print
查看>>
Servlet如何处理一个请求?
查看>>
Linux Daily2
查看>>
使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
查看>>
Office文档出错的几种原因与解决方法
查看>>
【实验报告】实验二:DHCP基本实验
查看>>
气质的培养(哈佛管理世界)
查看>>
Can&#39;t get Kerberos realm
查看>>
正则表达式 学习笔记1.1
查看>>
通过案例学调优之--AWR BaseLine管理
查看>>