JBPM工作流(五)——执行流程实例
概念:
ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图。
Execution,执行:一般情况下,一个流程实例是一个执行树的根节点。
使用树状结构的原因在于, 这一概念只有一条执行路径, 使用起来更简单。业务API不需要了解流程实例和执行之间功能的区别。因此,API里只有一个执行类型来引用流程实例和执行。
假设汇款和存档可以同时执行,那么主流程实例就包含了2个用来跟踪状态的子节点:
总的来说:
ProcessInstance(流程实例)就是Execution(执行对象),processInstanceId就是executionId。
在源码中,ProcessInstance接口直接继承了Execution接口。
1
2
3
4
5
6
7
8
9
10
11
12
|
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) 普通方法
1
2
3
4
5
6
7
8
9
10
11
12
|
// 启动流程实例 // 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) 启动流程实例,并设置一些流程变量
1
2
3
4
5
6
|
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离开活动
1
|
processEngine.getExecutionService().signalExecutionById(executionId); |
b) 向后执行一步,使用唯一的outcome离开活动,并设置一些流程变量
1
2
3
4
|
// 准备流程变量 Map<String, Object> variables = new HashMap<String, Object>(); variables.put( "审批结果" , "同意" ); processEngine.getExecutionService().signalExecutionById(executionId, variables); |
c) 向后执行一步,使用指定的outcome离开活动
1
2
|
String outcome= "to end1" ; processEngine.getExecutionService().signalExecutionById(executionId, outcome); |
d) 向后执行一步,使用指定的outcome离开活动,并设置一些流程变量
1
2
3
4
|
String outcome= "to end1" ; Map<String, Object> variables = new HashMap<String, Object>(); variables.put( "审批结果" , "同意" ); processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables); |
3.查询任务
a) 查询个人任务列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
// 查询我的未办理完的任务列表 // 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:
1
|
taskService.findGroupTasks(userId); |
方式2:
1
2
3
4
|
List<Task> list = processEngine.getTaskService() // .createTaskQuery() // .candidate(userId) // .list(); |
4.办理任务
a) 正常完成任务
1
2
3
4
5
6
7
8
9
10
|
@Test public void completeTask() { String taskId = "180009" ; //普通的方法 processEngine.getTaskService().completeTask(taskId); //指定下一步的方法 processEngine.getTaskService().completeTask(taskId, outcome); //设置流程变量的方法 processEngine.getTaskService().completeTask(taskId, outcome, variables); } |
b) 自行控制完成任务后是否向后流转(少用)
1
2
3
4
5
6
|
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 设置或获取流程变量
1
2
|
ExecutionService.setVariable(executionId, name, value); Object obj = executionService.getVariable(executionId, "请假人" ); |
b) 方式2:根据 taskId 设置或获取流程变量
1
2
|
TaskService.setVariables(taskId, variables); // 一次设置多个变量 Object obj = executionService.getVariable(executionId, "请假人" ); |
7.直接结束流程实例(手工)
1
2
|
String processInstanceId = "test.10001" ; processEngine.getExecutionService().endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED); |
JBPM工作流(五)——执行流程实例的更多相关文章
- JBPM4.4_执行流程实例
1. 执行流程实例 1.1. 启动流程实例 说明:流程实例创建后,直接就到开始活动后的第一个活动,不会在开始活动停留. 1.1.1. 示例代码1:使用指定key的最新版本的流程定义启动流程实例 Pro ...
- JBPM学习(四):执行流程实例
概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...
- JBPM学习(五):流程变量
1.启动流程实例 // 启动流程实例 @Test public void startProcessInstance() { // 使用指定key的最新版本的流程定义启动流程实例 ProcessInst ...
- 工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46646565 ***************************************** ...
- JBPM4入门——6.流程实例的创建和执行
本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...
- 工作流JBPM_day01:3-使用JBPM的API添加与执行流程
工作流JBPM_day01:3-使用JBPM的API添加与执行流程 流程定义画完得到压缩文件--->部署流程定义-->启动流程实例-->查询我的个人任务列表-->办理任务--& ...
- Activiti工作流学习(二)流程实例、执行对象、任务
一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流 ...
随机推荐
- Java知识回顾 (8) 集合
早在 Java 2 中之前,Java 就提供了特设类.比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组. 虽然这些类都非常有用,但是它们 ...
- caffe编译时候出现 undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'
1.编译时候出现 make: * [.build_release/examples/siamese/convert_mnist_siamese_data.bin] Error 1 /usr/local ...
- 我的Linux操作系统的发行版是什么?版本号是什么?
可以用下面的两个命令来查看: cat /etc/*-release hostnamectl 参考资料 ============== How To Find Out My Linux Distribut ...
- xhprof查看性能测试图一直报错:failed to execute cmd: " dot -Tpng"多种因素解决方案
xhprof查看性能测试图一直报错:failed to execute cmd: ” dot -Tpng”多种因素解决方案最近在新环境进行php代码性能测试,用了xhprof这个工具,搭建好以后,点击 ...
- 数据分析:基于Python的自定义文件格式转换系统
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Xtrabackup的安装
一.Installing Percona XtraBackup from Percona yum repository 添加源 yum install http://www.percona.com/d ...
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
测试结果 序列化数据对比 bytes字节数对比 具体的数字: protobuf jackson xstream Serializable hessian2 hessian2压缩 hessian1 ...
- 【C#】C#线程_基元线程的同步构造
目录结构: contents structure [+] 简介 为什么需要使用线程同步 线程同步的缺点 基元线程同步 什么是基元线程 基元用户模式构造和内核模式构造的比较 用户模式构造 易变构造(Vo ...
- RabbitMQ 学习专栏
RabbitMQ 官网:http://www.rabbitmq.com/ 原创博文 1.揭开消息中间件RabbitMQ的神秘面纱 2. RabbitMQ 服务器之下载安装 3. RabbitMQ 之修 ...
- mongodb常用查询语法
一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...