JBPM学习(四):运行流程实例

概念:

ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包含了全部执行阶段,当中最典型的属性就是跟踪当前节点的指针,例如以下图。

Execution,运行:普通情况下,一个流程实例是一个运行树的根节点。

使用树状结构的原因在于, 这一概念仅仅有一条运行路径, 使用起来更简单。业务API不须要了解流程实例和运行之间功能的差别。因此,API里仅仅有一个运行类型来引用流程实例和运行。

如果汇款和存档能够同一时候运行。那么主流程实例就包括了2个用来跟踪状态的子节点:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdjEyMzQxMTczOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

总的来说:

ProcessInstance(流程实例)就是Execution(运行对象),processInstanceId就是executionId。

在源代码中。ProcessInstance接口直接继承了Execution接口。

package org.jbpm.api;

/** a process instance is one execution of a process definition.
 * One process instance can have many concurrent executions.
 * Executions are structured in a tree of which the ProcessInstance
 * is the root.
 *
 * @author Tom Baeyens
 */
public interface ProcessInstance extends Execution {
}

凝视大概意思为:

一个流程实例是一个流程定义的运行。

一个流程实例能够有多个同一时候进行的运行对象。

运行对象构成了一棵树,而流程实例是这棵树的根结点。

1.启动流程实例

a) 普通方法

// 启动流程实例
	// jbpm4_execution,正在运行的信息表
	// jbpm4_hist_procinst,历史信息表
	@Test
	public void startProcessInstance() {
		// 使用指定key的最新版本号的流程定义启动流程实例,返回一个实例流程对象
		ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");

		System.out.println("id=" + pi.getId()//
				+ ", state=" + pi.getState()//
				+ ", processDefinitionId=" + pi.getProcessDefinitionId());
	}

b) 启动流程实例,并设置一些流程变量

Map<String, Object> variables = new HashMap<String, Object>();
	variables.put("申请人", "张三");
	variables.put("报销金额", 1000.00);

	// 启动流程实例,并设置一些流程变量
	ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processDefinitionKey, variables);

2.向后运行一步(Signal)

a) 向后运行一步。使用唯一的outcome离开活动

processEngine.getExecutionService().signalExecutionById(executionId);

b) 向后运行一步,使用唯一的outcome离开活动,并设置一些流程变量

// 准备流程变量
	Map<String, Object> variables = new HashMap<String, Object>();
	variables.put("审批结果", "允许");
	processEngine.getExecutionService().signalExecutionById(executionId, variables);

c) 向后运行一步。使用指定的outcome离开活动

String outcome= "to end1";
	processEngine.getExecutionService().signalExecutionById(executionId, outcome);

d) 向后运行一步,使用指定的outcome离开活动,并设置一些流程变量

String outcome= "to end1";
	Map<String, Object> variables = new HashMap<String, Object>();
	variables.put("审批结果", "允许");
	processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);

3.查询任务

a) 查询个人任务列表

// 查询我的未办理完的任务列表
	// jbpm4_task,正在运行的信息表
	// jbpm4_hist_task,历史信息表
	@Test
	public void findMyTaskList() {
		String userId = "员工";
		//String userId = "部门经理";
		//String userId = "总经理";

		// 方式1.查询我全部未办理的任务的列表
		// List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);
		// 方式2.分页的查询
		List<Task> list = processEngine.getTaskService()//
				.createTaskQuery()//
				.assignee(userId)//
				.page(0, 100)
				.list();

		// 显示
		System.out.println("============== 【" + userId + "】的未办理的任务列表 =============");
		for (Task t : list) {
			System.out.println("id=" + t.getId()//
					+ ", name=" + t.getName()// 任务的名称
					+ ", assignee=" + t.getAssignee()// 任务的办理人
					+ ", createTime=" + t.getCreateTime()// 任务的创建时间
					+ ", executionId=" + t.getExecutionId()); // 所属的运行对象的id
		}
	}

b) 查询组任务列表

方式1:

taskService.findGroupTasks(userId);

方式2:

List<Task> list = processEngine.getTaskService()//
			 .createTaskQuery()//
			 .candidate(userId)//
			 .list();

4.办理任务

a) 正常完毕任务

@Test
	public void completeTask() {
		String taskId = "180009";
		//普通的方法
		processEngine.getTaskService().completeTask(taskId);
		//指定下一步的方法
		processEngine.getTaskService().completeTask(taskId, outcome);
		//设置流程变量的方法
		processEngine.getTaskService().completeTask(taskId, outcome, variables);
	}

b) 自行控制完毕任务后是否向后流转(少用)

String taskId = "120001";
	// 1,设置为false代表:办理完任务后不向后移动(默觉得true)
	TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId);
	taskImpl.setSignalling(false);
	// 2,办理完任务
	processEngine.getTaskService().completeTask(taskId);

5.拾取任务(少用)

a) TaskService.takeTask(taskId, userId),拾取组任务到个人任务列表中。假设任务有assignee,则会抛异常。

b) processEngine.getTaskService().assignTask(taskId, userId),转交任务给其它人,(假设任务有assignee,则运行这种方法代表又一次分配。也能够把assignee设为null表示组任务没有人办理了)

6.设置与获取流程变量

a) 方式1:依据 executionId 设置或获取流程变量

ExecutionService.setVariable(executionId, name, value);
	Object obj = executionService.getVariable(executionId, "请假人");

b) 方式2:依据 taskId 设置或获取流程变量

TaskService.setVariables(taskId, variables); // 一次设置多个变量
	Object obj = executionService.getVariable(executionId, "请假人");

7.直接结束流程实例(手工)

String processInstanceId = 	"test.10001";
	processEngine.getExecutionService().endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);
时间: 2024-10-10 05:54:02

JBPM学习(四):运行流程实例的相关文章

JBPM学习(四):执行流程实例

1.创建表空间 create tablespace TEST logging datafile 'e:\app\administrator\oradata\orcl\TEST.dbf' size 100M autoextend on next 100M maxsize 4096M extent management local; 2.创建用户并指定表空间 create use testuser identified by password default tablespace TEST temp

Android Camera fw学习(四)-recording流程分析

Android Camera fw学习(四)-recording流程分析 备注:备注:本文是Android5.1学习笔记.博文按照软件启动流程分析.  且行且惜,一步一个脚印,这次学习camera Video.虽然标题是recording流程分析,但这里很多和preview是相似的(包含更新,创建Stream,创建Request),这里主要分析MediaRecorder对象创建.video帧监听对象注册.帧可用事件以及一系列callback流程分析. 一.认识video(mediaRecorde

TensorFlow学习之运行label_image实例

前段时间,搞了搞编译cc的实例,最后终于搞定...但想在IDE中编译还没成功,继续摸索中. 现分享一下,探究过程,欢迎叨扰,交流. http://home.cnblogs.com/u/mydebug/ 预备:inception_dec_2015文件解压到data文件夹下 具体看 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/label_image1.首先需要在tensorflow中安装bazel(

JBPM工作流(八)——流程实例(PI)Process Instance

/** * 流程实例 *    *  启动流程实例 *    *  完成任务 *    *  查询 *      *  查询流程实例 *      *  查询任务 *          *  查询正在执行的任务 *            *  查询所有的正在执行的任务 *            *  根据任务的执行人查询正在执行的任务 *            *  根据executionId查询正在执行的任务 *            *  根据piid查询正在执行的任务 *         

JBPM(四)——把流程部署到服务器上

当我们的业务流程被设计开发完毕之后,会有许多相关的文件"散落"在工程中,其中包括: 定义流程的JPDL文件 根据图形化流程定义同步生成的流程图片文件(PNG格式) 业务流程中用于人机交互的表单页面文件 事件监听器等用户自定义代码的Java类文件 其他流程资源文件,例如小图标.css样式表.脚本文件.属性文件等 jbpm4支持将流程定义及其相关资源打包一个JAR(Java归档)格式的文件,部署到服务器上(其实就是服务所连接的JBPM数据库中),然后流程定义就可以被执行了. 一.如何将流程

[原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

JBPM流程实例(PI)Process Instance

/** * 流程实例 *    *  启动流程实例 *    *  完成任务 *    *  查询 *      *  查询流程实例 *      *  查询任务 *          *  查询正在执行的任务 *            *  查询所有的正在执行的任务 *            *  根据任务的执行人查询正在执行的任务 *            *  根据executionId查询正在执行的任务 *            *  根据piid查询正在执行的任务 *         

JBPM学习(三):管理流程定义

概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程步骤的信息.没有更新操作,启动流程实例时是使用指定key的最新的版本. 1.部署流程定义 a)一次添加一个资源,相关文件在Classpath中 // 1,部署流程定义(添加) // jbpm4_deployment // jbpm4_deployprop // jbpm4_lob @Test pub

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

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