- 变量的设置和获取
在工作流的开发中,针对某一流程任务设置变量是常有的。例如再请假流程中,从流程的发起(即申请),经过各级审批,到最后流程结束;在流程申请时,申请人的申请信息,在申请审批时,审批人的意见等,都可以作为变量设置在流程中。
- 流程变量的设置
给正在执行的任务设置变量,首先需要获取正在执行的任务的ID(通过流程实例id和正在执行的任务相关的Service获取 – 在第二篇文章中有介绍),获取与任务相关的Service(getTaskService()),距离如下:
1)
TaskService taskService = processEngine.getTaskService();
/**通过正在执行的任务ID设置流程变量,基本数据类型*/
String taskId = "5204";
taskService.setVariableLocal(taskId,"请假理由","我要找女朋友,不知道她愿意不"); //该方法会自动绑定任务Id,保存到流程变量表中
taskService.setVariable(taskId,"请假时间",new Date());
taskService.setVariableLocal(taskId,"请假天数",7);
2)通过封装的java类设置变量(javabean)
/**设置流程变量,使用javabean类型*/
Person person = new Person();
person.setCode("person");
person.setName("测试");
taskService.setVariable(taskId,"人员信息",person);
Person:
import java.io.Serializable;
public class Person implements Serializable {
/***
* 版本控制(固定) -- 新增属性不影响该类的正常使用
*/
private static final long serialVersionUID = -6968423903037762467L; //序列化
private String code; //人员编号
private String name; //人员姓名
//新增属性,测试是否影响序列化
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
序列化的作用:
* 当一个Javabean(实现序列化)放置到流程变量中,则要求Javabean的属性不能再次修改,
* 如果发生变化,在进行变量获取的时候,会抛出异常
* 解决方案:
* 在Person对象中添加:
* 版本控制–同时实现序列化
- 流程变量的获取
获取设置的流程变量–通过设置变量时填写变量名称,举例如下:
/**根据任务id获取流程变量*/
TaskService taskService = processEngine.getTaskService();
String taskId = "5204";
/**获取流程变量,基础数据类型*/
String str1 = (String) taskService.getVariable(taskId,"请假理由");
Integer inte = (Integer) taskService.getVariable(taskId,"请假天数");
Date date = (Date) taskService.getVariable(taskId,"请假时间");
System.out.println("请假理由:"+str1);
System.out.println("请假天数:"+inte);
System.out.println("请假时间:"+date);
通过javabean设置的流程变量获取:
Person person = (Person) taskService.getVariable(taskId,"人员信息");
System.out.println("人员编号:"+person.getCode());
System.out.println("人员姓名:"+person.getName());
2.获取历史的流程变量信息:
List<HistoricVariableInstance> list = processEngine.getHistoryService()
.createHistoricVariableInstanceQuery() //创建一个历史的流程变量查询对象
.variableName("请假天数")//根据流程变量名称查询数据
.list();
if(list != null && list.size()>0){
for (HistoricVariableInstance hvi : list){
System.out.println(hvi.getId()+" "+hvi.getTaskId()+" "+hvi.getVariableName()+" "+hvi.getVariableTypeName()+" "+hvi.getValue());
System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5");
}
}
附加信息:
其他设置、获取变量的方式:
1.通过RuntimeService设置变量:
runtimeService.setVariable(executionId,variableName,value);//表示使用执行对象ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
runtimeService.setVariables(executionId,variables);//表示使用执行对象ID,和Map集合设置流程变量,map集合的Key就是流程变量的名称,map集合的value就是流程变量的值(一次可以设置多个值)
runtimeService.startProcessInstanceByKey(processDefinintionKey,variables);//启动流程实例的同时,可以设置流程变量,用Map集合
获取流程变量:
runtimeService.getVariable(executionId,variableName)//使用执行对象ID和流程变量的名称,获取流程变量的值
runtimeService.getVariables(executionId)//使用执行对象ID,获取所有的流程变量,将流程变量放置到Map集合中,map集合的key就是流程变量的名称,map集合的value就是流程变量的值
runtimeService.getVariables(executionId,variables)//使用执行对象ID,获取流程变量的值,通过设置流程变量的名称存放到集合中,获取指定流程变量名称的流程变量的值,值存放到map集合中
2.通过getTaskService设置流程变量:
taskService.setVariable(taskId,variableName,value);//表示使用任务ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
taskService.setVariables(taskId,variables);//表示使用任务ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值
taskService.complete(taskId,variables);//完成任务的同时,设置流程变量,用Map集合
获取流程变量:
taskService.getVariable(taskId,variable)//使用任务ID和流程变量的名称,获取流程变量的值
taskService.getVariables(executionIs);//使用任务ID,获取所有的流程变量,将流程变量放置到Map集合中,map集合的key就是流程变量的名称,map集合的value就是流程变量的值
taskService.getVariables(executionId,variables)//使用执任务ID,获取流程变量的值,通过设置流程变量的名称存放到集合中,获取指定流程变量名称的流程变量的值,值存放到map集合中