一、流程变量的作用
1.用来传递业务参数
2.指定连线完成任务(同意或拒绝)
3.动态指定任务办理人
二、测试代码块
Person类
package com.xingshang.processVariables; import java.io.Serializable; public class Person implements Serializable { /** * */ private static final long serialVersionUID = -4801857004005971862L; private Integer id;//编号 private String name;//名称 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
流程变量测试代码
package com.xingshang.processVariables; import java.io.InputStream; import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.zip.ZipInputStream; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricVariableInstance; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Test; public class ProcessVariablesTest { //工作引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /** * 部署流程定义(从inputStream) */ @Test public 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());// } /** * 启动流程实例 */ @Test public void startProcessInstance(){ //流程定义的key String processDefinitionKey = "processVariables"; ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的service .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应HelloWorld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动 System.out.println("流程实例ID: " + pi.getId());//流程实例ID System.out.println("流程定义ID: " + pi.getProcessDefinitionId());//流程定义ID } /** * 设置流程变量 */ @Test public void setVariables(){ //与任务相关(正在执行) TaskService taskService = processEngine.getTaskService(); //任务ID String taskId = ""; //一、设置流程变量,使用基本数据类型 /*taskService.setVariableLocal(taskId, "请假天数", 3);//与任务ID绑定 taskService.setVariable(taskId, "请假日期", new Date()); taskService.setVariable(taskId, "请假原因", "回家探亲");*/ /** * 二、设置流程变量,使用javabean类型 * * 注意: * 当一个javabean(实现序列化)放置到流程变量中,要求javabean的属性不能再发生变化 * 如果发生变化,在获取的时候,会抛出异常 * 解决方案:在Person对象中添加: * private static final long serialVersionUID = -4801857004005971862L; * 同时实现 Person实现 Serializable 接口 */ 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 = ""; //一、获取流程变量,使用基本数据类型 /*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()); } /** * 模拟设置和获取流程变量的场景 */ @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(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集合中 } /** * 完成我的任务 */ @Test public void completeMyPersonalTask(){ String taskId = ""; processEngine.getTaskService()//与正在执行的任务管理相关的Sercice .complete(taskId); System.out.println("任务完成: 任务Id: " + taskId); } /** * 查询流程变量的历史表 */ @Test public void findHistoryProcessVariables(){ List<HistoricVariableInstance> list = processEngine.getHistoryService() .createHistoricVariableInstanceQuery()//创建一个历史的流程变量查询对象 .variableName("请假天数") .list(); if(list != null && list.size() > 0){ for(HistoricVariableInstance h : list){ System.out.println(h.getId() + " " + h.getProcessInstanceId() + " " + h.getVariableTypeName() + " " + h.getVariableName() + h.getTaskId() + " " + h.getClass() + " " + h.getValue()); System.out.println("------------------------------------------"); } } } }
png图
三、流程变量总结
1.在流程执行或任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数
对应的表
a.) act_ru_variable :正在执行的流程变量表
b.) act_hi_varinst :流程变量历史表
2.setVariable和setVariableLocal的区别
setVariable:
设置流程变量的时候,流程变量名称相同的时候,后一次的值替代前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值
setVariableLocal:
a )设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在两个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替代前一次版本的值,它会使用不同的任务ID作为标识,存放两个流程变量值,而且可以看到TASK_ID的字段会存放任务ID的值
b )还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这条数据),所以查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量