深入了解activiti工作流流程实例与任务

2016-03-28|来源:

启动流程实例

启动流程实例的时候,操作以下几个表
act_ru_execution:执行对象表
act_ru_task:如果是用户任务,也会向此表中插入一条记录
act_ru_identitylink
act_hi_procinst:流程实例历史记录
act_hi_taskinst:每一步都会插入一条数据
act_hi_actinst:用户任务历史记录表
/** 启动流程实例 */
@Test
public void startProcessInstanceTest() {
   // 流程定义的key
   String processDefinitionKey = "hello";
   /**
    * RuntimeService:执行管理,包括启动、推进、删除流程实例等操作
    * 是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息
    */
   RuntimeService service = processEngine.getRuntimeService();
   /**
    * 使用流程定义的key启动流程实例,key对应hello.bpmn文件中id的属性值,
    * 使用key值启动,默认是按照最新版本的流程定义启动
    */
   ProcessInstance pi = service.startProcessInstanceByKey(processDefinitionKey);
   System.out.println("流程实例ID:" + pi.getId());// 流程实例ID:2501
   // 流程定义ID:hello:1:4
   System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
}


查看个人任务

  1. 因为是任务查询,所以从processEngine中应该得到TaskService

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

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

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

  5. 任务ID、名称、办理人、创建时间可以从act_ru_task表中查到。

  6. 在这种情况下,ProcessInstance相当于Execution

  7. 如果assignee属性为部门经理,结果为空。因为现在流程只到了填写请假申请阶段,后面的任务还没有执行,即在数据库中没有部门经理可以办理的任务,所以查询不到。

  8. 一个Task节点和Execution节点是11的情况,在task对象中使用Execution_来表示他们之间的关系

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

/**查询当前人的个人任务*/
@Test
public void queryAssigneeTaskTest(){
   //与正在执行的任务管理相关的Service
   TaskService service = processEngine.getTaskService();
   //创建任务查询对象
   TaskQuery query = service.createTaskQuery();
   //指定个人任务查询,指定办理人
   query.taskAssignee("张三");
   List<Task> list = query.list();
   if(list!=null && list.size()>0){
       for(Task task:list){
           System.out.println("任务ID:"+task.getId());
           System.out.println("任务名称:"+task.getName());
           System.out.println("任务的创建时间:"+task.getCreateTime());
           System.out.println("任务的办理人:"+task.getAssignee());
           System.out.println("流程实例ID:"+task.getProcessInstanceId());
           System.out.println("执行对象ID:"+task.getExecutionId());
           System.out.println("流程定义ID:"+task.getProcessDefinitionId());
       }
   }
}

activiti任务中,主要分为两大类查询任务(个人任务和组任务):

  1. 确切指定了办理者的任务,这个任务将成为指定者的私有任务,即个人任务。

  2. 无法指定具体的某一个人来办理的任务,可以把任务分配给几个人或者一到多个小组,让这个范围内的用户可以选择性(如有空余时间时)来办理这类任务,即组任务。

先知道个人任务的查询和办理,组任务的操作后面讲


办理任务

/**完成个人任务*/
@Test
public void completeTaskTest(){
   //任务ID
   String taskId = "7502";
   processEngine.getTaskService()
               .complete(taskId);
   System.out.println("完成任务:任务ID:"+taskId);
}


说明:

  1. 是办理任务,所以从ProcessEngine得到的是TaskService

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

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

  4. 部门经理的身份进行查询,可以查到结果。因为流程执行到部门经理审批这个节点了。

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

  6. 重复第34步直到流程执行完。


查询流程状态(判断流程正在执行,还是结束)

/**查询流程状态(判断流程正在执行,还是结束)*/
@Test
public void isProcessEnd(){
   String processInstanceId = "20001";
   ProcessInstance pi = processEngine.getRuntimeService()
                   .createProcessInstanceQuery()
                   .processInstanceId(processInstanceId)
                   .singleResult();
   if(pi==null){
       System.out.println("流程已经结束");
   }
   else{
       System.out.println("流程没有结束");
   }
}

      在流程执行的过程中,创建的流程实例ID在整个过程中都不会变,当流程结束后,流程实例将会在正在执行的执行对象表中(act_ru_execution)被删除

      说明:

  1. 因为是查询流程实例,所以先获取runtimeService

  2. 创建流程实例查询对象,设置实例ID过滤参数

  3. 由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大于1,则抛出异常

  4. 判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例在正在执行的执行对象表中已被删除,转换成历史数据。


总结

Execution   执行对象

按流程定义的规则执行一次的过程.

对应的表:

 act_ru_execution:正在执行的信息

 act_hi_procinst:已经执行完的历史流程实例信息

 act_hi_actinst:存放历史所有完成的活动

ProcessInstance  流程实例

特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。

注意

   1)如果是单例流程,执行对象ID就是流程实例ID

   2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同

   3)一个流程中,流程实例只有1个,执行对象可以存在多个。

Task 任务

执行到某任务环节时生成的任务信息。

对应的表:

 act_ru_task:正在执行的任务信息

 act_hi_taskinst:已经执行完的历史任务信息

本文参考于网络


相关问答

更多

java 的工作流框架 Activiti流程控制,一个流程走完了,如何触发最后的事件。

在pl/sql developer工具,也可以在其企业管理器中进去后中选sequence,然后新建,写上序列号名称seq,最小值写1,最大值不用管,开始于写1,增量是1,其它的默认就行了   sequence有两个用法,一个是得到后面一个值,一个是得到当前序列号的值   sequence.nextval得到是下一个序列号值   sequence.currval得到是当前序列号的值   你可以用select sequence.currval from seq   序列号建完后就入表里面插入   in ...

请问哪里有Activiti5工作流实战教程下载?

Activiti5应该是最新版本的吧,目前网上完整的 课程非常少,个人感觉比较好的一套 教程应该是Adam老师的《基于Activiti5 工作流 实战企业 协同OA办公系统》,是基于Activiti5的OA 办公系统,比较具有代表性的一套实战 案例教程。一共51讲,课程中采用了Spring-data-jpa来完成,spring-data-jpa是spring组织提供的,针对于jpa规范的一套持久化 框架,所有的查询均使用方法命名规则去解析, 开发人员只需要 定义 接口的方法而不需要写任何一句实现 ...

请问哪里有Activiti5工作流实战教程下载?

Activiti5应该是最新版本的吧,目前网上完整的 课程非常少,个人感觉比较好的一套 教程应该是Adam老师的《基于Activiti5 工作流 实战企业 协同OA办公系统》,是基于Activiti5的OA 办公系统,比较具有代表性的一套实战 案例教程。一共51讲,课程中采用了Spring-data-jpa来完成,spring-data-jpa是spring组织提供的,针对于jpa规范的一套持久化 框架,所有的查询均使用方法命名规则去解析, 开发人员只需要 定义 接口的方法而不需要写任何一句实现 ...

请问哪里有Activiti5工作流实战教程下载?

Activiti5应该是最新版本的吧,目前网上完整的课程非常少,个人感觉比较好的一套教程应该是Adam老师的《基于Activiti5工作流实战企业协同OA办公系统》,是基于Activiti5的OA办公系统,比较具有代表性的一套实战案例教程。一共51讲,课程中采用了Spring-data-jpa来完成,spring-data-jpa是spring组织提供的,针对于jpa规范的一套持久化框架,所有的查询均使用方法命名规则去解析,开发人员只需要定义接口的方法而不需要写任何一句实现代码。 以下是课程大纲, ...

本人想深入了解LINUX系统

如果是新手没必要去看内核,先看看外围吧!内核你现在是无法理解的。看清自己的学习用途再去学什么。

专题教程

JAVA概述
第一部分:java入门基础
第二部分:java常用类
第三部分:jdbc系列教程
第四部分:java高级特征
Gson教程
快速了解 jdk8 新特征

相关文章

更多

最近更新

更多