工做流学习——Activiti流程实例、任务管理四步曲

 

工做流学习——Activiti流程实例、任务管理四步曲

标签: 工做流activiti5java

2015-06-26 10:15 34242人阅读 评论(6) 收藏 举报mysql

 分类:sql

java学习(46) 数据库

目录(?)[+]app

1、前言

 

    上一篇文章中咱们将Activiti流程定义管理的知识进行了介绍,这篇文章咱们继续Activiti流程实例和任务管理的学习。学习

 

2、正文

 

流程实例(ProcessInstance )

 

    流程实例(ProcessInstance)和上一篇文章中流程定义(ProcessDefinition)的关系,与类和实例对象的关系有点像,ProcessDefinition是整个流程步骤的说明而ProcessInstance就是指流程定义从开始到结束的那个最大的执行路线。 spa

 

执行对象(Execution)

 

    提到ProcessInstance同时又会出现另外一个名词,那就是执行对象(Execution),Execution是按照ProcessDefinition的规则执行的当前的路线,.net

 

    若是ProcessDefinition只有一个执行路线的话,那么Execution和ProcessInstance就是彻底同样了若是ProcessDefinition中有多个执行路线的话,Execution和ProcessInstance多是同一个也可能不是同一个。因此得出结论:一个流程中ProcessInstance有且只能有一个,而Execution能够存在多个。对象

 

任务(Task )

 

    任务(Task)应该比较好理解,就是当流程执行到某步骤或某环节时生产的任务信息。blog

 

    在上篇文章中咱们将如何画流程图、如何部署流程定义已经介绍,流程定义和流程实例的关系刚才已经介绍了,全部如今咱们就该开始启动流程实例了:

 

代码

 

启动流程实例

 

[java] view plain copy

  1. /** 
  2.  * 启动流程实例 
  3.  */  
  4. @Test  
  5. public void startProcessInstance() {  
  6.     // 流程定义的key  
  7.     String processDefinitionKey = "HelloWorld";  
  8.     ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service  
  9.             .startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应HelloWorld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动  
  10.     System.out.println("流程实例ID:" + pi.getId());  
  11.     System.out.println("流程定义ID:" + pi.getProcessDefinitionId());  
  12. }  


运行结果:

 

 

    流程实例ID:501

    流程定义ID:HelloWorld:2:404

 

说明:

 

    1)在数据库的act_ru_execution正在执行的执行对象表中插入一条记录

    2)在数据库的act_hi_procinst程实例的历史表中插入一条记录

    3)在数据库的act_hi_actinst活动节点的历史表中插入一条记录

    4)咱们图中节点都是任务节点,因此同时也会在act_ru_task流程实例的历史表添加一条记录

    5)在数据库的act_hi_taskinst任务历史表中也插入一条记录。

 

 

 

查询历史流程实例

    

    流程实例启动之后,咱们也能够对某个流程实例一共一共执行了多少次流程进行查询,由于咱们本例中如今刚进行了一个流程,因此目前只能查出一个流程:

 

[java] view plain copy

  1. /** 
  2.  * 查询历史流程实例 
  3.  */  
  4. @Test  
  5. public void findHistoryProcessInstance(){  
  6.     String processInstanceId="501";  
  7.     HistoricProcessInstance hpi = processEngine.getHistoryService()  
  8.             .createHistoricProcessInstanceQuery()  
  9.             .processInstanceId(processInstanceId)  
  10.             .singleResult();  
  11.     System.out.println(hpi.getId() +"    "+hpi.getProcessDefinitionId()+"   "+ hpi.getStartTime()+"   "+hpi.getDurationInMillis());  
  12. }  


运行结果:

 

 

    501    HelloWorld:2:404   Fri Jun 26 09:34:51 CST 2015   null

 

 

 

 

查询当前的我的任务

 

    在上面讲流程启动后,由于该节点是任务节点因此在任务表中插入了任务的记录,如今咱们就经过办理人将任务进行下查询:

 

[java] view plain copy

  1. /** 
  2.  * 查询当前的我的任务 
  3.  */  
  4. @Test  
  5. public void findMyPersonTask() {  
  6.     String assignee = "张三"; // TODO  
  7.     List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的service  
  8.             .createTaskQuery()// 建立任务查询对象  
  9.             // 查询条件  
  10.             .taskAssignee(assignee)// 指定我的任务查询,指定办理人  
  11.             // .taskCandidateGroup("")//组任务的办理人查询  
  12.             // .processDefinitionId("")//使用流程定义ID查询  
  13.             // .processInstanceId("")//使用流程实例ID查询  
  14.             // .executionId(executionId)//使用执行对象ID查询  
  15.             /** 排序 */  
  16.             .orderByTaskCreateTime().asc()// 使用建立时间的升序排列  
  17.             // 返回结果集  
  18.             // .singleResult() //返回惟一的结果集  
  19.             // .count()//返回结果集的数量  
  20.             // .listPage(firstResult, maxResults)//分页查询  
  21.             .list();// 返回列表  
  22.     if (list != null && list.size() > 0) {  
  23.         for (Task task : list) {  
  24.             System.out.println("任务ID:" + task.getId());  
  25.             System.out.println("任务名称:" + task.getName());  
  26.             System.out.println("任务的建立时间:" + task.getCreateTime());  
  27.             System.out.println("任务的办理人:" + task.getAssignee());  
  28.             System.out.println("流程实例ID:" + task.getProcessInstanceId());  
  29.             System.out.println("执行对象ID:" + task.getExecutionId());  
  30.             System.out.println("流程定义ID:" + task.getProcessDefinitionId());  
  31.             System.out  
  32.                     .println("##################################################");  
  33.         }  


运行结果:

 

 

    任务ID:504

    任务名称:提交申请

    任务的建立时间:Fri Jun 2609:34:51 CST 2015

    任务的办理人:张三

    流程实例ID:501

    执行对象ID:501

    流程定义ID:HelloWorld:2:404

    ##################################################

 

说明:

 

    1)由于是任务查询,因此从processEngine中应该获得TaskService

    2)使用TaskService获取到任务查询对象TaskQuery

    3)为查询对象添加查询过滤条件,使用taskAssignee指定任务的办理者(即查询指定用户的代办任务),同时能够添加分页排序等过滤条件

    4)调用list方法执行查询,返回办理者为指定用户的任务列表

    5)任务ID、名称、办理人、建立时间能够从act_ru_task表中查到。

    6)在如今这种状况下,ProcessInstance至关于Execution

    7) 一个Task节点和Execution节点是1对1的状况,在task对象中使用Execution_来表示他们之间的关系

    8)任务ID在数据库表act_ru_task中对应“ID_”列

 

 

完成任务

 

    查询完任务后,咱们接下来将这个任务id为504的任务进行完成:

 

[java] view plain copy

  1. /** 
  2.  * 完成个人任务 
  3.  */  
  4. @Test  
  5. public void compliteMyPersonTask() {  
  6.     // 任务ID  
  7.     String taskId = "504";  
  8.     processEngine.getTaskService().complete(taskId);  
  9.     ;  
  10.     System.out.println("完成任务:任务ID:" + taskId);  
  11. }  


运行结果:

 

 

    完成任务:任务ID:504

 

说明:

 

    1)是完成任务,因此从ProcessEngine获得的是TaskService。

    2)当执行完这段代码,再以员工的身份去执行查询的时候,会发现这个时候已经没有数据了,由于正在执行的任务中没有数据。

    3)对于执行完的任务,activiti将从act_ru_task表中删除该任务,下一个任务会被插入进来。

    4)以”部门经理”的身份进行查询,能够查到结果。由于流程执行到部门经理审批这个节点了。

    5)再执行办理任务代码,执行完之后以”部门经理”身份进行查询,没有结果。

    6)重复第3和4步直到流程执行完。

 

 

查询历史任务

 

    员工张三的任务已经完成,如今任务到部门经理李四了,若是咱们如今仍然查询张三的任务的话,天然是查询不到了,只有查询李四才能够查到,不过咱们能够经过流程实例id查询历史任务,查询历史任务能够将已经办理过的任务和如今正在执行的任务都查询出来:

 

[java] view plain copy

  1. /** 
  2.  * 查询历史任务 
  3.  */  
  4. @Test  
  5. public void findHistoryTask(){  
  6.     String processInstanceId="501";  
  7.     List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的service  
  8.             .createHistoricTaskInstanceQuery()//建立历史任务实例查询  
  9.             .processInstanceId(processInstanceId)  
  10. //              .taskAssignee(taskAssignee)//指定历史任务的办理人  
  11.             .list();  
  12.     if(list!=null && list.size()>0){  
  13.         for(HistoricTaskInstance hti:list){  
  14.             System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());  
  15.             System.out.println("################################");  
  16.         }  
  17.     }     
  18.   
  19. }  


运行结果:

 

 

    504    提交申请   501   Fri Jun 26 09:34:51 CST2015   Fri Jun 26 09:50:50 CST 2015   959867

    ################################

    602    审批【部门经理】   501   Fri Jun 26 09:50:51 CST2015   null   null

    ################################

 

 

查询流程是否结束

 

    咱们还能够经过流程实例id查询某个流程如今的状态,是仍然在执行过程当中呢,仍是流程执行已经结束:

 

[java] view plain copy

  1. /** 
  2.  * 查询流程状态(判断流程正在执行,仍是结束) 
  3.  */  
  4. @Test  
  5. public void isProcessEnd(){  
  6.     String processInstanceId =  "501";  
  7.     ProcessInstance pi = processEngine.getRuntimeService()//表示正在执行的流程实例和执行对象  
  8.             .createProcessInstanceQuery()//建立流程实例查询  
  9.             .processInstanceId(processInstanceId)//使用流程实例ID查询  
  10.             .singleResult();  
  11.       
  12.     if(pi==null){  
  13.         System.out.println("流程已经结束");  
  14.     }  
  15.     else{  
  16.         System.out.println("流程没有结束");  
  17.     }  
  18.       
  19. }  

 

 

运行结果:

 

    流程没有结束

 

3、总结

 

    咱们这篇文章主要是流程实例、执行对象、任务以及他们之间的关系进行了学习,同时咱们还将启动和查询流程实例、判断流程实例是否执行结束、查看和办理任务以及查询历史任务都进行了介绍。

 

11

 

7

 

 

相关文章
相关标签/搜索