概念:

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

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

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

假设汇款和存档可以同时执行,那么主流程实例就包含了2个用来跟踪状态的子节点:

总的来说:

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);

  

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

  1. JBPM4.4_执行流程实例

    1. 执行流程实例 1.1. 启动流程实例 说明:流程实例创建后,直接就到开始活动后的第一个活动,不会在开始活动停留. 1.1.1. 示例代码1:使用指定key的最新版本的流程定义启动流程实例 Pro ...

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

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

  3. JBPM工作流(五)——执行流程实例

    概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...

  4. JBPM学习(五):流程变量

    1.启动流程实例 // 启动流程实例 @Test public void startProcessInstance() { // 使用指定key的最新版本的流程定义启动流程实例 ProcessInst ...

  5. jBPM学习之部署流程定义

    也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...

  6. JBPM4入门——6.流程实例的创建和执行

    本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...

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

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

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

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

  9. jBPM学习之利用API完成流程实例

    流程引擎对象ProcessEngine是jBPM4所有的Service API之源.在jBPM4中各种服务相互依存,但所有的Service API都从ProcessEngine中获得,由此可见Proc ...

随机推荐

  1. [转载]用c写PHP的扩展接口(php5,c++)

    原文[http://bugs.tutorbuddy.com/php5cpp/php5cpp/] 第1节. 开始之前 开始前,我要说明:这篇文章所描述的主要是在UNIX的PHP环境上的. 另外一点我要说 ...

  2. Android之监测手机网络状态的广播

    Android之监测手机网络状态的广播 Android 监控网络状态 Android利用广播监听设备网络连接(断网)的变化情况

  3. Eclipse 安装Activiti 插件失败解决方法

    遇到的错误为:1.4.0' but it could not be found等.

  4. easyui源码翻译1.32--DateBox(日期输入框)

    前言 扩展自$.fn.combo.defaults.使用$.fn.datebox.defaults重写默认值对象.下载该插件翻译源码 日期输入框结合了一个可编辑的文本框控件和允许用户选择日期的下拉日历 ...

  5. Joda-Time

    任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.现在来看看 Joda Time,一 ...

  6. 如何查看跟踪查看LINUX内核中的源码

    我的博客:www.while0.com 最近看LINUX书籍时,根据书中代码找相应的函数或者结构定义相当吃力,根据网上资料按以下方法查找速度较快. 1.安装ctags 在源代码目录下运行 ctags ...

  7. 【HDOJ】4516 威威猫系列故事——因式分解

    可解的算法太多了,采用的算法是试x的值.注意题目的输入x^3-2x^2不会写成x^3+-2x^2.一直RE在这儿. /* 4516 */ #include <iostream> #incl ...

  8. 【原创】MIPS中断系统的板级验证及实例测试

    “五一”假期前后这约五天时间,终于将MIPS中断系统进行了板级验证及实例测试.因为老师给的交叉编译工具不会用,所以测试代码完全用MIPS汇编编写.使用MARS而没有用QtSpim,其实我觉得SPIM这 ...

  9. comparison of floating point numbers with equality operator. possible loss of precision while rounding values

    double值由外部传入 private void Compare(double value) { string text; ) //小数位后保留2位 { //小数点后保留2位小数 text = st ...

  10. Eclipse使用技巧及个性化设计

    以下除特殊说明均在 Windows->Preferences里面操作 如何把Eclipse关闭提示调出来? General->Startup and Shutdown,在 Confirm ...