1、启动流程
  在完成了流程定义部署后,就要启动流程实例了。
 /**
* 1 启动流程
* 当流程到达一个节点时,会在act_ru_execution表中产生1条数据
* 如果当前节点是用户任务节点,这时会在act_ru_task表中产生1条数据(任务的办理人,任务的创建时间)
*/
@Test
public void startProcess() throws Exception {
/**
* v1 myProcess:2:604
* v2 myProcess:3:704
*/
// runtimeService.startProcessInstanceById(processDefinitionId)
// 通过流程定义的key启动流程,会启动版本最高的流程
ProcessInstance pi = runtimeService.startProcessInstanceByKey("LeaveFlow");
System.out.println("pid:" + pi.getId() +",activitiId:" + pi.getActivityId());
}

2、查看流程状态

 public void queryProcessState() throws Exception {
String processInstanceId="1401";
// 通过流程实例ID查询流程实例
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
if(pi!=null){
System.out.println("当前流程在:" + pi.getActivityId());
}else{
System.out.println("流程已结束!!");
}
}

3、查看公有任务

  对指定用户的可接取的公共任务执行查询。

 public void queryCommonTask() throws Exception {
// 创建任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
// 配置查询对象
String candidateUser="张三";
taskQuery
// 过滤条件
.taskCandidateUser(candidateUser)
// 分页条件
// .listPage(firstResult, maxResults)
// 排序条件
.orderByTaskCreateTime().desc();
// 执行查询
List<Task> tasks = taskQuery.list();
System.out.println("======================【"+candidateUser+"】的公共任务列表=================");
for (Task task : tasks) {
System.out.print("id:"+task.getId()+",");
System.out.print("name:"+task.getName()+",");
System.out.print("createTime:"+task.getCreateTime()+",");
System.out.println("assignee:"+task.getAssignee());
}
}

说明:

  1.查询任务首先使用TaskService创建TaskQuery对象

  2.在查询对象上,添加taskCandidateUser过滤条件,代表过滤任务候 选者为自己的任务

  3.调用list方法返回指定用户的可接任务列表

  4.所有公共任务的assignee属性为空

4、查看私有任务

  对指定用户的未完成的个人任务执行查询。

 public void queryPersonalTask() throws Exception {
// 创建任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
// 配置查询对象
// String assignee="user";
String assignee="李四";
taskQuery
// 过滤条件
.taskAssignee(assignee)
// 分页条件
// .listPage(firstResult, maxResults)
// 排序条件
.orderByTaskCreateTime().desc();
// 执行查询
List<Task> tasks = taskQuery.list();
System.out.println("======================【"+assignee+"】的代办任务列表=================");
for (Task task : tasks) {
System.out.print("id:"+task.getId()+",");
System.out.print("name:"+task.getName()+",");
System.out.print("createTime:"+task.getCreateTime()+",");
System.out.println("assignee:"+task.getAssignee());
}
}

说明:

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

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

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

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

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

  6)     Execution与ProcessInstance见5.6章节的介绍。在这种情况下,ProcessInstance相当于Execution

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

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

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

5、认领任务

  通常一个任务为公共任务任务都有一个以上的候选者,用户想要办理它应该先进行认领任务操作,即把自己变成任务的拥有者。

 public void takeTask() throws Exception {
// claim 认领
String taskId="1404";
String userId="李四";
// 让指定userId的用户认领指定taskId的任务
taskService.claim(taskId, userId);
System.out.println("认领操作完毕!!");
}

 说明:

  1.任务相关操作,首先得到taskService

  2.确定被认领的任务ID和认领人ID

  3.调用taskService的claim(认领)方法,把公共任务变成指定用户的 私有任务

6、办理任务

public void complete() throws Exception {
String taskId = "1602";
// 完成任务
taskService.complete(taskId );
}

说明:

  1)     办理任务,从ProcessEngine得到的是TaskService。

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

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

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

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

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

7、验证流程已经结束

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

说明:

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

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

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

  4)     判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例已被删除

Activiti流程实例管理的更多相关文章

  1. 工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)

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

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

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

  3. 工作流学习——Activiti流程定义管理三步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...

  4. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...

  5. Activiti的流程实例及挂起激活(七)

    1.1什么是流程实例 参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例.是动态的.流程定义和流程实例的图解: 1.2启动流程实例 流程定义部署在 activiti 后, ...

  6. Activiti工作流学习(二)流程实例、执行对象、任务

    一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流 ...

  7. Activiti的流程实例【ProcessInstance】与执行实例【Execution】

    最近,我在做流程引擎Activiti相关的东西,刚开始时的一个知识点困扰了我许久,那就是Activiti的ProcessInstance与Execution的区别,这是一个Activiti的难点,能够 ...

  8. 从零开始学习和改造activiti流程引擎的13天,自己记录一下

    day#1(11.13) 尝试通过spring boot 集成最新版activiti 7,但是苦于官方的文档基本为空,无法完成spring boot的配置,最终按照activiti 6的文档,手工初始 ...

  9. Springboot 整合Activiti流程设计器 完成一个简单的请假流程

    目录 1.前言 2.准备 3.下载解压 4.开始整合 mysql + activiti + thymeleaf 2.配置文件 3.复制文件 4.加入控制器 5.修改配置文件 6.剔除启动类里面的安全校 ...

随机推荐

  1. Codeforces Round #563 (Div. 2) F. Ehab and the Big Finale

    后续: 点分治标程 使用father数组 比使用vis数组优秀(不需要对vis初始化) https://codeforces.com/problemset/problem/1174/F https:/ ...

  2. 廖雪峰Java15JDBC编程-3JDBC接口-5JDBC连接池

    1. JDBC连接池 1.1 JDBC连接池简介 线程池可以复用一个线程,这样大量的小任务通过线程池的线程执行,就可以避免反复创建线程带来的开销. 同样JDBC可以复用一个JDBC连接 JDBC的连接 ...

  3. (转载)js引擎的执行过程(一)

    概述 js是一种非常灵活的语言,理解js引擎的执行过程对我们学习javascript非常重要,但是网上讲解js引擎的文章也大多是浅尝辄止或者只局部分析,例如只分析事件循环(Event Loop)或者变 ...

  4. shiro框架的组成和内部结构(下一篇为spring整合shiro)

    1.shiro简介 Apache Shiro是Java的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. ​ 实际上,Shir ...

  5. LUOGU P4253 [SCOI2015]小凸玩密室(树形dp)

    传送门 解题思路 玄学树形\(dp\),题目描述极其混乱...看错了两次题,设首先根据每次必须点完子树里的灯才能点别的,那么点灯情况只有两种,第一种是点到某一个祖先,第二种是点到某一个祖先的兄弟.所以 ...

  6. ASP.NET的底层体系1

    文章引导 1.ASP.NET的底层体系1 2.ASP.NET的底层体系2 引言: 学习ASP.NET,要想做的更好,不了解ASP.NET是不行的.一个有理想的程序员都会像挤压海绵一样,努力的去学习和获 ...

  7. hdu-1394(线段树求最小逆序数)

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意: 给定一个n,然后又n个数字,首先,这些数字的大小是从0开始到n-1,比如样例n=10,则这十个数就 ...

  8. 使用Navicat连接管理远程linux服务器上的mysql数据库

    第一步:选择连接,选择mysql 第二步:填写下面弹出框的信息:连接名随便写,主机名或IP地址:写上服务器的ip.  端口不变  用户名不变.  密码:输入服务器数据库的密码12345678. 接着测 ...

  9. flexbox属性速览及常见布局实现

    CSS3 弹性盒子(Flex Box)弹性盒子是即 CSS2 浮动布局后, CSS3 的一种新的布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同 ...

  10. 如何在neo4j中创建新数据库?

    解决方案一: 由于使用Neo3.x创建新数据库而不删除现有数据库,所以只需在$NEO4J_HOME的conf的目录编辑neo4j.conf. 搜寻dbms.active_database=,其默认值应 ...