Activiti学习记录(三)
1.流程变量
1.1 流程图

流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
流程变量的作用:
1.用来传递业务参数
2.指定连线完成任务(同意和拒绝)
3.动态指定任务的办理人
1.2 输入流加载资源文件的3种方式


1.3.设置和获取流程变量
/**
* 设置流程变量
*/
@Test
public void setVariables() {
/**与任务相关(正在执行)**/
TaskService taskService = processEngine.getTaskService();
//任务ID
String taskId = "2304";
//设置流程变量,使用基本数据类型
taskService.setVariableLocal(taskId , "请假天数", 5);//与任务id绑定
taskService.setVariable(taskId , "请假日期", new Date());
taskService.setVariable(taskId , "请假原因","回家探亲,一起吃个饭");
/**使用javabean设置流程变量**/
/**
* 当一个javabean(实现序列化)放置到流程变量中,要求javabean的属性不能在发生变化
* 如果发生变化,在获取时会抛出异常
* 解决办法:在javabean序列化时,固定序列化版本 private static final long serialVersionUID = 1L;
*/
Person p = new Person();
p.setId(10);
p.setName("翠花");
taskService.setVariable(taskId, "人员信息", p);
System.out.println("设置流程变量成功!");
}
/**
* 获取流程变量
*/
@Test
public void getVariables() {
/**与任务相关(正在执行)**/
TaskService taskService = processEngine.getTaskService();
//任务ID
String taskId = "2304";
/*Integer days = (Integer) taskService.getVariable(taskId, "请假天数");
Date date = (Date) taskService.getVariable(taskId, "请假日期");
String reson = (String) taskService.getVariable(taskId, "请假原因"); System.out.println("请假天数:"+days);
System.out.println("请假日期:"+date);
System.out.println("请假原因:"+reson);*/
/**使用javabean获取流程变量**/
Person person = (Person) taskService.getVariable(taskId, "人员信息");
System.out.println(person.getId()+":"+person.getName());
}
说明:
1) 流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
2) 使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
3) Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID(private static final long serialVersionUID = 1L)
1.4 模拟流程变量的设置和获取的场景
/**
* 模拟设置和获取流程变量的场景
*/
@Test
public void setAndGetVariables() {
/**与流程实例,执行对象(正在执行)**/
RuntimeService runtimeService = processEngine.getRuntimeService();
/**与任务相关(正在执行)**/
TaskService taskService = processEngine.getTaskService(); /**设置流程变量**/
// runtimeService.setVariable(executionId, variableName, value);//表示使用执行对象id,和流程变量的名称,设置流程变量的值(一次只能设置一次)
// runtimeService.setVariables(executionId, variables);//表示使用执行对象id和map集合设置流程变量,map集合的key是流程变量的名称,map集合的value是流程变量的值 // taskService.setVariable(executionId, variableName, value);//表示使用执行任务id,和流程变量的名称,设置流程变量的值(一次只能设置一次)
// taskService.setVariables(executionId, variables);//表示使用执行任务id和map集合设置流程变量,map集合的key是流程变量的名称,map集合的value是流程变量的值 // runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用map集合
// taskService.complete(taskId, variables);//完成任务的同时,可以设置流程变量,用map集合
/**获取流程变量**/
// runtimeService.getVariable(executionId, variableName)//执行对象的id和名称,获取流程变量的值
// runtimeService.getVariables(executionId);//使用执行对象id,获取所欲的流程变量,将流程变量放入map集合中,map集合的key是流程变量的名称,map集合的value是流程变量的值
// runtimeService.getVariables(executionId, variableNames);//使用执行对象id,获取流程变量的值,可以通过设置流程变量的名称存放在集合中,获取指定流程变量名称的流程变量的值,并存放在map中 // taskService.getVariable(executionId, variableName)//执行任务的id和名称,获取流程变量的值
// taskService.getVariables(executionId);//使用执行任务id,获取所有的流程变量,将流程变量放入map集合中,map集合的key是流程变量的名称,map集合的value是流程变量的值
// taskService.getVariables(executionId, variableNames);//使用执行任务id,获取流程变量的值,可以通过设置流程变量的名称存放在集合中,获取指定流程变量名称的流程变量的值,并存放在map中 }
说明:
1) RuntimeService对象可以设置流程变量和获取流程变量
2) TaskService对象可以设置流程变量和获取流程变量
3) 流程实例启动的时候可以设置流程变量
4) 任务办理完成的时候可以设置流程变量
5) 流程变量可以通过名称/值的形式设置单个流程变量
6) 流程变量可以通过Map集合,同时设置多个流程变量
Map集合的key表示流程变量的名称
Map集合的value表示流程变量的值
2 总结
- 1:流程变量
在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。
对应的表:
act_ru_variable:正在执行的流程变量表
act_hi_varinst:流程变量历史表
- 2:扩展知识:setVariable和setVariableLocal的区别
setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值
setVariableLocal:
1:设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到TASK_ID的字段会存放任务ID的值
例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。
如图:

2:还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。
Activiti学习记录(三)的更多相关文章
- JavaScript学习记录三
title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- 3.VUE前端框架学习记录三:Vue组件化编码1
VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...
- leveldb 学习记录(三) MemTable 与 Immutable Memtable
前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...
- Activiti学习记录(二)
1.初始化数据库 使用工作流引擎创建23张表 public class TestActiviti { /** * 使用代码创建工作流需要的23张表 */ @Test public void creat ...
- Activiti学习记录(一)
1.工作流的概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现 ...
- webrtc学习———记录三:mediaStreamTrack
参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...
- 下页小希学MVC5+EF6.2 学习记录三
目的:1 学习mvc+ef 2 写下日记也是对自己的督促 期待已久的EF终于来了. 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型 ...
- ES6深入学习记录(三)编程风格
今天学习阮一峰ES6编程风格,其中探讨了如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,写出合理的.易于阅读和维护的代码. 1.块级作用域 (1)let 取代 v ...
- activiti 学习( 三 ) 之 流程启动者
在启动一个流程时,我们会有将当前用户启动的流程保存起来,作为流程发起人(启动人.申请人.提交人) 而在保存这个流程启动者信息,api 没有明确规范该怎么存.所以这里我总结下我学到的保存流程启动者信息的 ...
随机推荐
- web综合案例02
web综合案例02 web综合案例02 web综合案例02 ... ... 内容待添加
- poj2186-Popular Cows(强连通分支)
有N(N<=10000)头牛,每头牛都想成为most poluler的牛,给出M(M<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不可以相互,即1欢迎2不代表2欢迎1 ...
- Django组件-cookie,session
昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反 ...
- Docker从入门到实战(四)
Docker基础 一:Docker基本操作 一般情况安装Docker之后系统会自动创建一个Docker的用户组,如果没有创建可以手动创建groupadd docker把当前非root用户加入group ...
- FTP服务器FileZilla Server配置及使用方法
FileZilla Server下载安装完成后,安装过程不写说明了,网上一抓一大把,直接从配置开始记录. 1.创建服务器 ² Password:栏位中输入本服务器Filezilla服务的密码, ² ...
- Unity Destroy和DestroyImmediate
Destroy(Object obj, float t = 0.0F); 删除一个游戏对象,组件或者资源. 物体obj现在被销毁或在指定了t时间过后销毁.如果obj是组件,它将从GameObject销 ...
- 类成员函数的重载、覆盖和隐藏区别 (C++)(转)
类成员函数的重载.覆盖和隐藏区别 (C++) 这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载. ...
- 深入V8引擎-Time核心方法之win篇(2)
这一篇讲windows系统下TimeTicks的实现. 对于tick,V8写了相当长的一段discussion来讨论windows系统上计数的三种实现方法以及各自的优劣,注释在time.cc的572行 ...
- Windows10 zip安装 MySQL8.0.12
其实问题不大,就是win10永远有点奇葩的地方. 下载,解压,命名什么的我就不说了. 一 环境变量方便cmd使用mysql MYSQL_HOME = xxx // 就是安装的路径 Path = %MY ...
- CSS里的 no-repeat
简单来说,CSS里的 no-repeat是针对背景图片来说的.当你设置了no-repeat这个属性后,你的背景图片将不会被重复,再换一种说法,你在网站上所看到的背景图片就是你所添加的图片, 不会出现平 ...