http://blog.csdn.net/zwk626542417/article/details/46646565

***********************************************************

一、前言

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

二、正文

流程实例(ProcessInstance )

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

执行对象(Execution)

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

如果ProcessDefinition只有一个执行路线的话,那么Execution和ProcessInstance就是完全一样了如果ProcessDefinition中有多个执行路线的话,Execution和ProcessInstance可能是同一个也可能不是同一个。所以得出结论:一个流程中ProcessInstance有且只能有一个,而Execution可以存在多个。

Executions are a representation of the 'token' concept of BPMN 2.0. Basically an execution is a pointer pointing to where the process instance currently is.

(remember a process instance consists of a tree of executions).

当流程中含有分支,子流程时.一个execution指向主流程的位置,其子execution指向子流程的当前执行位置

# http://www.activiti.org/userguide/index.html#_executions

任务(Task )

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

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

代码

启动流程实例

[java] view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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. }

运行结果:

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 plaincopy
  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. if(pi==null){
  12. System.out.println("流程已经结束");
  13. }
  14. else{
  15. System.out.println("流程没有结束");
  16. }
  17. }

运行结果:

流程没有结束

三、总结

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

转载于:https://www.cnblogs.com/zhao1949/p/6089233.html

工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)相关推荐

  1. 工作流学习——Activiti整体认识二步曲

    一.前言 在上一篇文章中我们将工作流的相关概念.activiti的前世今生.activiti与jbpm的比较进行学习,这篇文章我们正式进行activiti的学习,activiti的整个学习我们主要通过 ...

  2. activiti 流程实例与业务关联

    学习activiti,很快就可以学会,但是运用还是一个问题,比如在你学习的过程中,都是写Test来测试,创建processEngine,流程部署,开始流程,完成任务等等,没有完成的一套流程,要讲act ...

  3. 工作流实战_17_flowable 流程实例撤回

    由于群里有些朋友对这个flowable还不是很熟悉,师傅(小学生05101)制作一个开源的项目源码,一共大家学习和交流,希望对有帮助,少走弯路 如果有不懂的问题可以入群:633168411 里面都是一 ...

  4. Activiti 流程实例、任务、执行对象及相关的表

    一个流程中,流程实例只有一个,执行对象可以有多个(如果存在分支和聚合) SELECT * FROM activiti.act_ru_execution a;  #正在执行的执行对象表 SELECT * ...

  5. Activiti流程实例开始结束,接收任务活动

    代码: StartTest.java package com.ytdx.start;import java.io.InputStream;import org.activiti.engine.Proc ...

  6. 工作流实战_12_flowable 流程实例 终止流程

    项目地址 https://gitee.com/lwj/flowable.git 代码分支 flowable-base 视频讲解地址 https://space.bilibili.com/4855245 ...

  7. 工作流实战_11_flowable 流程实例 跟踪流程

    项目地址 https://gitee.com/lwj/flowable.git 代码分支 flowable-base 视频讲解地址 https://space.bilibili.com/4855245 ...

  8. 工作流实战_10_flowable 流程实例的删除

    项目地址 https://gitee.com/lwj/flowable.git 代码分支 flowable-base 视频讲解地址 https://space.bilibili.com/4855245 ...

  9. 工作流实战_08_flowable 流程实例的启动

    项目地址 https://gitee.com/lwj/flowable.git 代码分支 flowable-base 视频讲解地址 https://space.bilibili.com/4855245 ...

最新文章

  1. 解决java.lang.UnsupportedClassVersionError
  2. 打印N个数组整体最大的TopK
  3. 关于window.location可以获取的信息
  4. synchronized修饰方法和代码块的区别
  5. linux的nohup命令
  6. linux目录详解i-node,i-node节点与链接
  7. 软件工程学习进度第七周暨暑期学习进度之第七周汇总
  8. 对AngularJS的编译和链接过程讲解一步到位的文章
  9. 手册-网站-仙客传奇团队博客
  10. 清明上河图对计算机技术的启发,《清明上河图》鉴定故事的启示
  11. [转]供应链管理方面的书籍
  12. 2009中文菜谱网站排行之十大兵器
  13. 解决:mmc0: error -110 whilst initialising SD card.md
  14. 在线报表设计实战系列 – ②制作表格类报表
  15. 数据库简介、SQL 语的增加删除修改查询命令
  16. 花呗不小心升级了信用购会影响什么
  17. ResNet深度残差网络
  18. 新生赛第一题:dls的黑粉
  19. Mysql闪退问题图文解决办法
  20. QT学习之QString的arg方法

热门文章

  1. 使用ANNdotNET GUI工具创建CIFAR-10深度学习模型
  2. s5pv210 linux内核移植,S5PV210(TQ210)学习笔记——内核移植与文件系统构建之二
  3. 读取文本节点_TextRank抽取型文本摘要
  4. unwrap函数c语言实现,AppDomain与Assembly的动态加载与卸载代码详解
  5. 计算机常见故障报警,常见听报警志与故障
  6. 光子不维护服务器,光子云和光子服务器
  7. 阿德莱德计算机科学怎么样,阿德莱德大学计算机科学硕士专业怎么样?成为IT大牛的不二之选...
  8. oracle表段是什么,【DB笔试面试274】在Oracle中,什么是延迟段创建(Deferred Segment Crea......
  9. linux ubutu书籍,Ubuntu Linux入门到精通[图书]
  10. php mysql 录入_MYSQL+PHP表单录入数据的问题