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

一、前言

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

二、正文

流程实例(ProcessInstance )

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

执行对象(Execution)

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

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

任务(Task )

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

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

代码

启动流程实例

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

运行结果:

流程实例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任务历史表中也插入一条记录。

查询历史流程实例

流程实例启动以后,我们也可以对某个流程实例一共一共执行了多少次流程进行查询,因为我们本例中现在刚进行了一个流程,所以目前只能查出一个流程:

/**
 * 查询历史流程实例
 */
@Test
public void findHistoryProcessInstance(){
	String processInstanceId="501";
	HistoricProcessInstance hpi = processEngine.getHistoryService()
			.createHistoricProcessInstanceQuery()
			.processInstanceId(processInstanceId)
			.singleResult();
	System.out.println(hpi.getId() +"    "+hpi.getProcessDefinitionId()+"   "+ hpi.getStartTime()+"   "+hpi.getDurationInMillis());
}

运行结果:

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

查询当前的个人任务

在上面讲流程启动后,因为该节点是任务节点所以在任务表中插入了任务的记录,现在我们就通过办理人将任务进行下查询:

/**
 * 查询当前的个人任务
 */
@Test
public void findMyPersonTask() {
	String assignee = "张三"; // TODO
	List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的service
			.createTaskQuery()// 创建任务查询对象
			// 查询条件
			.taskAssignee(assignee)// 指定个人任务查询,指定办理人
			// .taskCandidateGroup("")//组任务的办理人查询
			// .processDefinitionId("")//使用流程定义ID查询
			// .processInstanceId("")//使用流程实例ID查询
			// .executionId(executionId)//使用执行对象ID查询
			/** 排序 */
			.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
			// 返回结果集
			// .singleResult() //返回唯一的结果集
			// .count()//返回结果集的数量
			// .listPage(firstResult, maxResults)//分页查询
			.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());
			System.out
					.println("##################################################");
		}

运行结果:

任务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的任务进行完成:

/**
 * 完成我的任务
 */
@Test
public void compliteMyPersonTask() {
	// 任务ID
	String taskId = "504";
	processEngine.getTaskService().complete(taskId);
	;
	System.out.println("完成任务:任务ID:" + taskId);
}

运行结果:

完成任务:任务ID:504

说明:

1)是完成任务,所以从ProcessEngine得到的是TaskService。

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

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

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

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

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

查询历史任务

员工张三的任务已经完成,现在任务到部门经理李四了,如果我们现在仍然查询张三的任务的话,自然是查询不到了,只有查询李四才可以查到,不过我们可以通过流程实例id查询历史任务,查询历史任务可以将已经办理过的任务和现在正在执行的任务都查询出来:

/**
 * 查询历史任务
 */
@Test
public void findHistoryTask(){
	String processInstanceId="501";
	List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的service
			.createHistoricTaskInstanceQuery()//创建历史任务实例查询
			.processInstanceId(processInstanceId)
//				.taskAssignee(taskAssignee)//指定历史任务的办理人
			.list();
	if(list!=null && list.size()>0){
		for(HistoricTaskInstance hti:list){
			System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());
			System.out.println("################################");
		}
	}	

}

运行结果:

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查询某个流程现在的状态,是仍然在执行过程中呢,还是流程执行已经结束:

/**
 * 查询流程状态(判断流程正在执行,还是结束)
 */
@Test
public void isProcessEnd(){
	String processInstanceId =  "501";
	ProcessInstance pi = processEngine.getRuntimeService()//表示正在执行的流程实例和执行对象
			.createProcessInstanceQuery()//创建流程实例查询
			.processInstanceId(processInstanceId)//使用流程实例ID查询
			.singleResult();

	if(pi==null){
		System.out.println("流程已经结束");
	}
	else{
		System.out.println("流程没有结束");
	}

}

运行结果:

流程没有结束

三、总结

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

时间: 2024-10-14 19:15:53

工作流学习——Activiti流程实例、任务管理四步曲的相关文章

工作流学习——Activiti流程变量五步曲

一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们平常理解的变量是一样的,只不过是用在了我们activiti中,所以称为流程变量,流程变量在整个工作流扮演着很重要的角色. 例如,请假流程中有请假天数.请假原因等一些参数都是流程变量使用的范围,流程变量的作用域范围是只对应一个流程实例.也就是说各个流程实例的流程变量是不互相影响的.流程实例结束完成以后流程变量还保存在数据库中(存放在流程变量的历史表中

工作流学习——Activiti流程定义管理三步曲

一.前言 在上一篇文章我们通过一个小demo对Activiti进行了宏观的介绍,让大家对Activiti有了整体的认识,这篇文章我们来学习具体的流程定义管理的CRUD. 二.正文 流程定义是什么 ProcessDefinition(流程定义)就是一个流程的步骤说明,比如我们接下来要说的这个流程,申请人王三发起提交申请,李四作为部门经理进行审批,审批完成后,此申请到达下一级总经理王五,进行审批.就这么整个流程说明其实就是流程定义,不过在Activiti中整个流程定义是以helloworld.bpm

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

http://blog.csdn.net/zwk626542417/article/details/46602419 **************************************************************** 一.前言 在上一篇文章我们通过一个小demo对Activiti进行了宏观的介绍,让大家对Activiti有了整体的认识,这篇文章我们来学习具体的流程定义管理的CRUD. 二.正文 流程定义是什么 ProcessDefinition(流程定义)就是一个流

Activiti流程实例管理

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.startProcess

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

前言 在上一篇文章中我们将工作流的相关概念.activiti的前世今生.activiti与jbpm的比较进行学习,这篇文章我们正式进行activiti的学习,activiti的整个学习我们主要通过例子的形式来理解.今天我们主要是准备下activiti的环境,在数据库中创建activiti默认的23张表以及activiti核心对象ProcessEngine最后是一个activiti的简单demo. 环境准备 相关软件及版本: jdk版本:Jdk1.8 IDE:eclipse 数据库:mysql A

工作流学习——Activiti整体认识二步曲 (zhuan)

http://blog.csdn.net/zwk626542417/article/details/46594505 *********************************************** 一.前言 在上一篇文章中我们将工作流的相关概念.activiti的前世今生.activiti与jbpm的比较进行学习,这篇文章我们正式进行activiti的学习,activiti的整个学习我们主要通过例子的形式来理解.今天我们主要是准备下activiti的环境,在数据库中创建activ

activiti 7 + springboot2(八) Activiti流程实例动态设置assignee执行人

(一)activiti流程图用流程变量设置节点执行人 Activiti 使用 UEL 表达式, UEL 是 java EE6 规范的一部分, UEL(Unified Expression Language)即统一表达式语言, activiti 支持两个 UEL 表达式: UEL-value 和 UEL-method. <!--UEL-value: user1 是一个流程变量 --> <userTask activiti:assignee="${user1}$" act

005 流程实例

一 .概述 当我们成功的部署了流程定义之后,我们就需要创建一个流程实例.本节,我们就学习一下流程实例部分的内容. 二 .开始一个流程实例 /** * 开始一个流程实例 */ @Test public void startProcessInstance(){ org.activiti.engine.runtime.ProcessInstance instance = ProcessEngines.getDefaultProcessEngine() .getRuntimeService() .sta

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

一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流程部署 --->  2.启动流程实例 --- > 3.执行流程对象(一个流程实例包含多执行对象) ---> 4.完成整个流程 说明: 三.例子演示   1.完成我的任务     2.查询流程状态(判断流程正在执行,还是结束) 3.查询历史任务  4.流程实例.执行对象.任务  四.对应数据库