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学习记录(三)的更多相关文章

  1. JavaScript学习记录三

    title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  2. 3.VUE前端框架学习记录三:Vue组件化编码1

    VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  3. leveldb 学习记录(三) MemTable 与 Immutable Memtable

    前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...

  4. Activiti学习记录(二)

    1.初始化数据库 使用工作流引擎创建23张表 public class TestActiviti { /** * 使用代码创建工作流需要的23张表 */ @Test public void creat ...

  5. Activiti学习记录(一)

    1.工作流的概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现 ...

  6. webrtc学习———记录三:mediaStreamTrack

    参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...

  7. 下页小希学MVC5+EF6.2 学习记录三

      目的:1 学习mvc+ef 2  写下日记也是对自己的督促 期待已久的EF终于来了. 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型 ...

  8. ES6深入学习记录(三)编程风格

    今天学习阮一峰ES6编程风格,其中探讨了如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,写出合理的.易于阅读和维护的代码. 1.块级作用域 (1)let 取代 v ...

  9. activiti 学习( 三 ) 之 流程启动者

    在启动一个流程时,我们会有将当前用户启动的流程保存起来,作为流程发起人(启动人.申请人.提交人) 而在保存这个流程启动者信息,api 没有明确规范该怎么存.所以这里我总结下我学到的保存流程启动者信息的 ...

随机推荐

  1. Flutter SDK的下载与安装步骤 (mac版)

    本月初(应该是2018年12月4日),Google在其Flutter Live 2018大会上正式发布 Flutter 1.0 版本. 当然我们不会怀疑Google团队的技术实力,但它和React N ...

  2. 06.Spring 资源加载 - ResourceLoader

    基本概念 ResourceLoader 接口,在 Spring 中用于加载资源,通过它可以获取一个 Resouce 对象. 内部构造 首先来看它的接口定义: public interface Reso ...

  3. remote error: You can't push to git 解决办法

  4. linux高级编程基础系列:线程间通信

    linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...

  5. Python lambda(匿名函数)介绍【转】

    引用: http://www.cnblogs.com/evening/archive/2012/03/29/2423554.html 在学习python的过程中,lambda的语法时常会使人感到困惑, ...

  6. 织梦通过 phpmyadmin 导出的数据,再次导入的时候报错

    错误提示: #1291 – Column 'nature' has duplicated value '婆婆妈妈' in SET SQL 查询: -- -- 导出表中的数据 `dede_member_ ...

  7. <Linux系统isosize指令用法>

    isosize命令:iso9660文件系统大小显示 isosize命令用于显示iso9660文件系统的大小,还文件可以使普通文件,也可以是块设备,如/dev/sr0或者/dev/sda.如果没有相关选 ...

  8. Android图表库XCL-Charts

    首先,这个是国人开发的,支持下必须顶!github项目地址:点击打开,由于项目的基本功能已经实现,所以项目作者也说以后基本不会在有更新了. 项目简介: Android图表库(XCL-Charts is ...

  9. 【踩坑】服务器部署springboot应用时报错--端口被tomcat占用

    今天将本机尬聊一下项目(基于netty-socketio)的服务端程序调试好以后,通过jar包部署在服务器的时候,出现了报错,提示tomcat已经占用了端口. 之前在部署iReview项目时的确是通过 ...

  10. 2833 奇怪的梦境 未AC

    2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold         题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小 ...