流程变量在整个工作流扮演着很重要的角色,用于数据的传递
设置流程变量的方式
方式一:启动流程实例时设置
/**
* 启动流程实例时设置流程变量
*/
@Test
public void test2() {
String processDefinitionKey = "bxlc";// 流程定义key
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("key1", "value1");
variables.put("loginUser", "小王");
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println(pi.getId());
}
方式二:使用RuntimeService的set方法设置
/**
* 使用RuntimeService的set方法设置流程变量
*/
@Test
public void test4() {
String executionId = "201";//流程实例id
Map<String, Object> variables = new HashMap<>();
variables.put("审批意见", "以后注意");
variables.put("user", new User(10,20,"北京"));
processEngine.getRuntimeService().setVariables(executionId, variables);
//用于设置单个key-value
//processEngine.getRuntimeService().setVariable(executionId, variableName, value);
}
方式三:使用TaskService的set方法设置
/**
* 使用TaskService的set方法设置流程变量
*/
@Test
public void test5() {
String taskId = "304";
String key = "审批意见";
Object value = "不批";
processEngine.getTaskService().setVariable(taskId , key, value);
}
方式四:办理任务时设置
/**
* 办理任务时设置流程变量
*/
@Test
public void test3() {
String taskId = "206";//任务id
Map<String, Object> variables = new HashMap<>();
variables.put("qjyy", "不想上班");
variables.put("qjts", 365);
processEngine.getTaskService().complete(taskId, variables);
}
注意:
1.在同个流程实例下,流程变量里如果使用同一个key设置多次,则后一个value会把前一个value覆盖
2.而不同流程实例下,流程变量的key可以相同,不冲突不覆盖
3.如果设置的value是自定义的类型,则该类型需要实现序列号接口,而且该对象会被序列化存储到act_ge_bytearray表中
获取流程变量的方式
方式一:使用RuntimeService的get方法获取
/**
* 使用RuntimeService的get方法获取流程变量
*/
@Test
public void test6() {
String executionId = "201";
Map<String, Object> variables = processEngine.getRuntimeService().getVariables(executionId);
Set<String> keySet = variables.keySet();
for (String key : keySet) {
Object value = variables.get(key);
System.out.println(key + " = " + value);
}
}
方式二:使用TaskService的get方法获取
/**
* 使用TaskService的get方法获取流程变量
*/
@Test
public void test7() {
String taskId = "304";
Object value = processEngine.getTaskService().getVariable(taskId , "user");
System.out.println(value);
}
方式三:使用框架提供的表单式获取
注意:
1.方式三中,当执行到该任务时,框架会根据当前流程实例去流程变量表act_ru_variable里查找该key,如果有则赋值成功,没有则抛出异常
2.当流程变量表中存有自定义类型的对象数据时,如果更改了自定义类型的内容,则在取出数据库数据时,该对象会反序列化失败
3.当流程实例的所有任务执行完成后,相应的流程变量会从数据库里删除