Activiti学习笔记七 流程变量
2015-01-04 14:38
477 查看
上一篇我们看了流程执行时的流程实例,任务,和执行对象,我们接着看流程变量。
流程变量
![](https://img-blog.csdn.net/20150104145656375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE3MTAyNjIzNTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
act_ru_task 任务表
![](https://img-blog.csdn.net/20150104153836884?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE3MTAyNjIzNTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
任务ID 执行对象ID 流程实例ID
说明:
1)流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
2)基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值
3)Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
4)设置流程变量的时候,向act_ru_variable这个表添加数据
act_ru_variable #正在执行的流程变量表
![](https://img-blog.csdn.net/20150104154943536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE3MTAyNjIzNTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20150104155138882?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE3MTAyNjIzNTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
说明:
1)流程变量的获取针对流程实例(1个流程),每个流程实例获取的流程变量是不同的
2)使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
3)Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
说明:
1)RuntimeService对象可以设置流程变量和获取流程变量
2)TaskService对象也可以设置流程变量和获取流程变量
3)流程实例启动的时候可以设置流程变量
4)任务办理完成的时候可以设置流程变量
5)流程变量可以通过名称/值的形式设置单个流程变量
6)流程变量可以通过Map集合,同时设置多个流程变量,Map集合的key表示流程变量的名称,value表示流程变量的值
说明:历史的流程变量查询,指定流程变量的名称,查询act_hi_varinst表(也可以针对,流程实例ID,执行对象ID,任务ID查询)。
![](https://img-blog.csdn.net/20150104165126358?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE3MTAyNjIzNTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从图中的官方文档可以看出包括了大部分封装类型和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 表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。
如图:
![](https://img-blog.csdn.net/20150104170413833?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE3MTAyNjIzNTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2)还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。
流程变量
1.流程图
流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
2.部署流程定义
private final ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /** * 功能: 部署流程定义(从InputStream).<br/> * date: 2014年12月23日 下午3:40:40 <br/> * * @author xzzhao@wisdombud.com */ @Test public void deploymentProcessDefinitionByInputStream() { 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()); }
3.启动流程实例
/** * 功能: 启动流程实例.<br/> * date: 2014年12月23日 下午3:45:37 <br/> * * @author xzzhao@wisdombud.com */ @Test public void startProcessInstance() { // 流程定义的key String processDefinitionKey = "processVariables"; ProcessInstance pi = processEngine.getRuntimeService()// 获取正在执行的流程实例和执行对象相关的Service .startProcessInstanceByKey(processDefinitionKey); // 使用流程定义的key启动流程实例 // key // 对应processVariables.bpmn中的Id属性 System.out.println(pi.getId()); // 流程实例Id 2201 System.out.println(pi.getProcessDefinitionId()); // 流程定义Id // processVariables:1:1604 }
act_ru_task 任务表
任务ID 执行对象ID 流程实例ID
4.设置流程变量
/** * 功能: 设置流程变量.<br/> * date: 2014年12月23日 下午3:58:36 <br/> * * @author xzzhao@wisdombud.com */ @Test public void setVariables() { TaskService taskService = processEngine.getTaskService(); // 任务Id String taskId = "2704"; /** 1.使用基本数据类型设置流程变量 **/ taskService.setVariableLocal(taskId, "请假天数", 3); // 与任务ID绑定 taskService.setVariable(taskId, "请假日期", new Date()); taskService.setVariable(taskId, "请假原因", "回家养病,大概一周把!"); /** 2.使用Javabean类型设置流程变量 **/ User user = new User(); user.setId(10); user.setName("小红"); taskService.setVariable(taskId, "用户信息", user); System.out.println("设置成功!"); }
说明:
1)流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
2)基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值
3)Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
4)设置流程变量的时候,向act_ru_variable这个表添加数据
act_ru_variable #正在执行的流程变量表
5.获取流程变量
/** * 功能: 获取流程变量.<br/> * date: 2014年12月23日 下午3:59:11 <br/> * * @author xzzhao@wisdombud.com */ @Test public void getVariables() { TaskService taskService = processEngine.getTaskService(); // 任务Id String taskId = "2204"; /** 1.基本数据类型获取流程变量 */ Integer days = (Integer) taskService.getVariable(taskId, "请假天数"); Date date = (Date) taskService.getVariable(taskId, "请假日期"); String comment = (String) taskService.getVariable(taskId, "请假原因"); System.out.println("请假天数:" + days + "\n 请假日期:" + date + "\n 请假原因:" + comment); /** 2.Javabean类型获取流程变量 */ User u = (User) taskService.getVariable(taskId, "用户信息"); System.out.println("id:" + u.getId() + " name:" + u.getName()); }
说明:
1)流程变量的获取针对流程实例(1个流程),每个流程实例获取的流程变量是不同的
2)使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
3)Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
6.模拟设置和获取流程变量
/** * 功能: 模拟设置和获取流程变量.<br/> * date: 2014年12月23日 下午4:00:11 <br/> * * @author xzzhao@wisdombud.com */ @Test public void setAndGetVariables() { RuntimeService runtimeService = processEngine.getRuntimeService(); TaskService taskService = processEngine.getTaskService(); /** 设置流程变量 **/ // runtimeService.setVariable(executionId, variableName, value); // runtimeService.setVariables(executionId, variables); // taskService.setVariable(taskId, variableName, value); // 使用任务Id,和流程变量的名称,设置流程变量的值 // taskService.setVariables(taskId, variables);使用任务Id,和Map集合设置流程变量,设置多个值 // runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);启动流程实例的同时,可以设置流程变量,使用Map集合 // taskService.complete(taskId, variables);完成任务的同时,设置流程变量,使用Map集合 /** 获取流程变量 **/ // runtimeService.getVariable(executionId,variableName);使用执行对象Id和流程变量名称,获取值 // runtimeService.getVariables(executionId);使用执行对象Id,获取所有的流程变量,返回Map集合 // runtimeService.getVariables(executionId,variableNames);使用执行对象Id,获取流程变量的值,通过设置流程变量的名称存放到集合中,获取指定流程变量名称的流程变量的值,值存放到Map中 // taskService.getVariable(taskId,variableName);使用任务Id和流程变量名称,获取值 // taskService.getVariables(taskId);使用任务Id,获取所有的流程变量,返回Map集合 // taskService.getVariables(taskId,variableNames);使用任务Id,获取流程变量的值,通过设置流程变量的名称存放到集合中,获取指定流程变量名称的流程变量的值,值存放到Map中 }
说明:
1)RuntimeService对象可以设置流程变量和获取流程变量
2)TaskService对象也可以设置流程变量和获取流程变量
3)流程实例启动的时候可以设置流程变量
4)任务办理完成的时候可以设置流程变量
5)流程变量可以通过名称/值的形式设置单个流程变量
6)流程变量可以通过Map集合,同时设置多个流程变量,Map集合的key表示流程变量的名称,value表示流程变量的值
7.查询历史的流程变量
/** * 功能: 查询历史的流程变量.<br/> * date: 2015年1月4日 下午4:42:17 <br/> * * @author xzzhao@wisdombud.com */ @Test public void findHistoryProcessVariables() { List<HistoricVariableInstance> list = processEngine.getHistoryService()// .createHistoricVariableInstanceQuery() // 创建一个历史的流程变量查询对象 .variableName("请假天数").list(); if (null != list && list.size() > 0) { for (HistoricVariableInstance hvi : list) { System.out.println(hvi.getId() + " " + hvi.getProcessInstanceId() + " " + hvi.getVariableName() + " " + hvi.getVariableTypeName() + " " + hvi.getValue()); System.out.println("###################################"); } } }
说明:历史的流程变量查询,指定流程变量的名称,查询act_hi_varinst表(也可以针对,流程实例ID,执行对象ID,任务ID查询)。
8.流程变量支持的类型
从图中的官方文档可以看出包括了大部分封装类型和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说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。
相关文章推荐
- Activiti 学习笔记五:流程变量
- Activiti 学习笔记五:流程变量
- Activiti流程管理学习笔记(三)
- Activiti学习笔记三:管理流程定义
- Activiti 学习笔记十:开始活动节点(判断流程是否结束及查询历史)
- activiti学习笔记(二) 获取流程实例
- 工作流引擎Activiti学习第四天(七)--- 设置获取与流程变量
- Activiti流程管理学习笔记(一)
- 工作流引擎Activiti学习---使用流程变量进行个人任务分配
- Activiti 学习笔记四:流程实例、任务的执行
- Activiti 学习笔记十:开始活动节点(判断流程是否结束及查询历史)
- Activiti学习笔记六 流程实例 任务 执行对象控制流程执行
- Activiti学习笔记三:管理流程定义
- Activiti学习笔记3 — 流程定义
- 工作流学习——Activiti流程变量五步曲
- Activiti学习笔记4 — 流程实例化
- activiti5学习笔记(二)伪审批汇总流程
- Lua学习笔记2--变量域和流程控制
- Activiti 学习笔记四:流程实例、任务的执行
- 工作流引擎Activiti学习---使用流程变量进行个人任务分配