Activiti——流程变量

转自:http://lib.csdn.net/article/java/66665?knId=268

流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。

一、部署流程定义

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/** 部署流程定义(从InputStream) */@Testpublic void deploymentProcessDefinition_inputStream() {InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service.createDeployment()// 创建一个部署对象.name("流程定义")// 添加部署的名称.addInputStream("processVariables.bpmn", inputStreambpmn)// 使用资源文件的名称(要求:与资源文件的名称要一致),和输入流完成部署.addInputStream("processVariables.png", inputStreampng)// 使用资源文件的名称(要求:与资源文件的名称要一致),和输入流完成部署.deploy();// 完成部署System.out.println("部署ID:" + deployment.getId());//System.out.println("部署名称:" + deployment.getName());//}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

说明: 
输入流加载资源文件的3种方式 

二、启动流程实例

/** 启动流程实例 */@Testpublic void startProcessInstance() {// 流程定义的keyString processDefinitionKey = "processVariables";ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动System.out.println("流程实例ID:" + pi.getId());// 流程实例IDSystem.out.println("流程定义ID:" + pi.getProcessDefinitionId());// 流程定义ID}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

三、设置流程变量

/** 设置流程变量 */@Testpublic void setVariables() {/** 与任务(正在执行) */TaskService taskService = processEngine.getTaskService();// 任务IDString taskId = "2104";/** 一:设置流程变量,使用基本数据类型 */// taskService.setVariableLocal(taskId, "请假天数", 5);//与任务ID绑定// taskService.setVariable(taskId, "请假日期", new Date());// taskService.setVariable(taskId, "请假原因", "回家探亲,一起吃个饭");/** 二:设置流程变量,使用javabean类型 *//*** 当一个javabean(实现序列号)放置到流程变量中,要求javabean的属性不能再发生变化 * 如果发生变化,再获取的时候,抛出异常* * 解决方案:在Person对象中添加: private static final long serialVersionUID =* 6757393795687480331L; 同时实现Serializable*/Person p = new Person();p.setId(20);p.setName("翠花");taskService.setVariable(taskId, "人员信息(添加固定版本)", p);System.out.println("设置流程变量成功!");}
  • 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

说明:

  1. 流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
  2. 基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
  3. Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
  4. 设置流程变量的时候,向act_ru_variable这个表添加数据

四、获取流程变量

/** 获取流程变量 */@Testpublic void getVariables() {/** 与任务(正在执行) */TaskService taskService = processEngine.getTaskService();// 任务IDString taskId = "2104";/** 一:获取流程变量,使用基本数据类型 */// Integer days = (Integer) taskService.getVariable(taskId, "请假天数");// Date date = (Date) taskService.getVariable(taskId, "请假日期");// String resean = (String) taskService.getVariable(taskId, "请假原因");// System.out.println("请假天数:"+days);// System.out.println("请假日期:"+date);// System.out.println("请假原因:"+resean);/** 二:获取流程变量,使用javabean类型 */Person p = (Person) taskService.getVariable(taskId, "人员信息(添加固定版本)");System.out.println(p.getId() + "        " + p.getName());}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

说明:

  1. 流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
  2. 使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
  3. Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID

五、模拟流程变量的设置和获取的场景

/** 模拟设置和获取流程变量的场景 */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(taskId, variableName,// value)//表示使用任务ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)// taskService.setVariables(taskId,// 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(taskId,// variableName);//使用任务ID和流程变量的名称,获取流程变量的值// taskService.getVariables(taskId);//使用任务ID,获取所有的流程变量,将流程变量放置到Map集合中,map集合的key就是流程变量的名称,map集合的value就是流程变量的值// taskService.getVariables(taskId,// variableNames);//使用任务ID,获取流程变量的值,通过设置流程变量的名称存放到集合中,获取指定流程变量名称的流程变量的值,值存放到Map集合中}
  • 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
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

说明:

  1. RuntimeService对象可以设置流程变量和获取流程变量
  2. TaskService对象可以设置流程变量和获取流程变量
  3. 流程实例启动的时候可以设置流程变量
  4. 任务办理完成的时候可以设置流程变量
  5. 流程变量可以通过名称/值的形式设置单个流程变量
  6. 流程变量可以通过Map集合,同时设置多个流程变量 
    Map集合的key表示流程变量的名称 
    Map集合的value表示流程变量的值

六、查询历史的流程变量

/** 查询流程变量的历史表 */@Testpublic void findHistoryProcessVariables() {List<HistoricVariableInstance> list = processEngine.getHistoryService()//.createHistoricVariableInstanceQuery()// 创建一个历史的流程变量查询对象.variableName("请假天数").list();if (list != null && list.size() > 0) {for (HistoricVariableInstance hvi : list) {System.out.println(hvi.getId() + "   " + hvi.getProcessInstanceId() + "   " + hvi.getVariableName()+ "   " + hvi.getVariableTypeName() + "    " + hvi.getValue());System.out.println("###############################################");}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

说明: 
历史的流程变量查询,指定流程变量的名称,查询act_hi_varinst表(也可以针对,流程实例ID,执行对象ID,任务ID查询)

七、流程变量的支持的类型

Type name Description
string Value is threaded as a java.lang.String. Raw JSON-text value is used when writing a variable.
integer Value is threaded as a java.lang.Integer. When writing, JSON number value is used as base for conversion, falls back to JSON text.
short Value is threaded as a java.lang.Short. When writing, JSON number value is used as base for conversion, falls back to JSON text.
long Value is threaded as a java.lang.Long. When writing, JSON number value is used as base for conversion, falls back to JSON text.
double Value is threaded as a java.lang.Double. When writing, JSON number value is used as base for conversion, falls back to JSON text.
boolean Value is threaded as a java.lang.Boolean. When writing, JSON boolean value is used for conversion.
date Value is treated as a java.util.Date. When writing, the JSON text will be converted using ISO-8601 date format.
binary Binary variable, treated as an array of bytes. The value attribute is null, the valueUrl contains an URL pointing to the raw binary stream.
serializable Serialized representation of a Serializable Java-object. As with the binary type, the value attribute is null, the valueUrl contains an URL pointing to the raw binary stream. All serializable variables (which are not of any of the above types) will be exposed as a variable of this type.

从图中可以看出包括了大部分封装类型和Date、String和实现了Serializable接口的类的类型。

八、总结

  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说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。

    源码demo下载:http://download.csdn.net/detail/xunzaosiyecao/9622475

Activiti——流程变量(六)相关推荐

  1. activiti流程变量

    import org.activiti.engine.*; import org.activiti.engine.repository.Deployment; import org.activiti. ...

  2. 学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot

    本篇学习笔记是观看黑马程序员Activiti7视频而得 Activiti7 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是" ...

  3. 【activiti】流程变量

    activiti流程变量 1. 什么是流程变量 流程变量在activiti中是一个非常重要的角色,流程运转有时就需要流程变量,流程变量就是activiti在管理工作流时根据管理需要而设置的变量. 前面 ...

  4. JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成

    管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...

  5. Activiti工作流之流程变量

    1.什么是流程变量 流程变量在 activiti 中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和 activiti 结合时少不了流程变量,流程变量就是 activiti 在管理工作流时 ...

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

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

  7. Activiti工作流(三)——流程变量

    流程变量可以是流程中一系列参数,比如办理人(Assignee),消息(message)等.这些流程变量使得activiti能够应用于更为复杂的业务中,使得流程变得更加灵活可控. 场景(一) 图一:没有 ...

  8. 《Activiti/Flowable  深入BPM工作流》-什么是流程变量?

               <Activiti/Flowable  深入BPM工作流>-什么是流程变量? 一. 问题:         1. 什么是流程变量?        2. 什么是glob ...

  9. flowable工作流 流程变量_业务流程 BPM、工作流引擎、Flowable、Activiti

    特点 基于 Flowable(Activiti)生来具有的稳定工作流引擎 支持在线流程设计器,流程导入导出,符合 BPMN 规范,中国式工作流 支持流程办理.退回.自由流.会签.并行.串行.服务任务等 ...

最新文章

  1. 单点登录系统SSO概述 | 单点登录讲解(1)
  2. linux条件表达式例子,Linux的Iptables命令的基本知识(三)-常用匹配条件示例和执行动作...
  3. SVM学习(三):线性分类器的求解
  4. 批量备SAP中CBO ABAP 程序代码为TXT文件备份
  5. 记一个bug定位与修复过程
  6. java类加载过程_java类的加载过程
  7. jquery日期时间控件
  8. windows命令行启动常用工具
  9. app测试的过程和重点关注内容
  10. 网路游侠:铱迅软件版WEB应用防火墙试用
  11. MeteoInfoLab脚本示例:MODIS Sinusoidal投影HDF数据
  12. Visual Studio 2010如何利用宏
  13. CTP: 为什么报网络原因发送失败,但连接却成功?
  14. web前端面试之基础面试题(一)(含答案)
  15. 微型计算机对应的英文名,跟中文名匹配的英文名
  16. 实景三维模型修补水面方法汇总及对比(DPmodeler、模方等)
  17. 移动硬盘无法读取是怎么回事?
  18. 义隆单片机学习笔记之(二) 指令系统
  19. Dlink路由器后门分析
  20. 如何快速判断一个数是否是素数

热门文章

  1. 2022-2028年中国DTRO膜行业市场全景评估及产业前景规划报告
  2. 2022-2028年中国汽车橡胶件行业市场调查研究及前瞻分析报告
  3. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)
  4. LeetCode简单题之卡牌分组
  5. MinkowskiEngine demo ModelNet40分类
  6. YOLOv4 资源环境配置和测试样例效果
  7. DOM相关内容(课程来源:B站 后盾人)
  8. git保姆级入门(包含解决git仓库报错500的问题)
  9. Android Intent hasExtra()方法的使用
  10. 有关GBDT(Gradient Boosting Decison Tree,梯度提升树)