设置和获取变量的方法
1. 流程启动设置变量 ,整个流程都是生效的,任意节点都可以获取
runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用Map集合
2. runtimeService executionId 设置变量
runtimeService.setVariable(executionId, variableName, value)//表示使用执行对象ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
---value 可以是自定义对象,例如Person对象
runtimeService.setVariables(executionId, variables)//表示使用执行对象ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
3. taskService taskId 设置变量
taskService.setVariable(taskId, variableName, value)//表示使用任务ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
---value 可以是自定义对象,例如Person对象
taskService.setVariables(taskId, variables)//表示使用任务ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
4. 任务完成是设置变量,传给下一个任务
taskService.complete(taskId, variables)//完成任务的同时,设置流程变量,用Map集合
5. 获取值:以上任何方式设置,都可以用以下方式获取
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).基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
3).Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
4).设置流程变量的时候,向act_ru_variable这个表添加数据
javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
代码:
@ApiOperation("启动实例")
@GetMapping("first")
public void firstDemo(){
//myFirstProcess:3:1568
String processDefinitionId = "myFirstProcess:3:1568";
//启动流程
//设置变量 全局有效
Map paramMap = new HashMap();
paramMap.put("p1","p1111");
paramMap.put("p2","p2222");
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId,paramMap);
System.out.println("流程实例ID:-->"+processInstance.getId());
System.out.println("流程定义ID:-->"+processInstance.getProcessDefinitionId());
System.out.println("流程执行ID:-->"+processInstance.getSuperExecutionId());
}
@ApiOperation("设置变量:runTimeserver")
@GetMapping("thirteen")
public void thirteenDemo(){
// 任务:-->task_hello_1 流程实例:-->10001 TASKID:-->10007executeId:10004
Person person = new Person(100,"zcy456","幼儿园");
runtimeService.setVariable("10004","人员姓名","zcy123");
runtimeService.setVariable("10004","person 对象",person);
}
/**
* runtimeService taskService 设置变量 会覆盖。execid 和 taskid 是一对一的。其实设置一样的
*/
@ApiOperation("获取变量:runTimeserver")
@GetMapping("sixteen")
public void sixteenDemo(){
System.out.println(" 人员姓名a:"+runtimeService.getVariable("10004","人员姓名"));
System.out.println(" person 对象a:"+runtimeService.getVariable("10004","person 对象").toString());
System.out.println(" confirm a:"+runtimeService.getVariable("27504","confirm").toString());
}
@ApiOperation("设置变量:taskservice")
@GetMapping("fourteen")
public void fourteenDemo(){
Person person = new Person(200,"WXB456","幼儿园");
taskService.setVariable("10007","人员姓名","WXB123");
taskService.setVariable("10007","person 对象",person);
}
@ApiOperation("获取变量:taskservice")
@GetMapping("fiveteen")
public void fiveteenDemo(){
System.out.println(" 人员姓名:"+taskService.getVariable("32502","人员姓名").toString());
System.out.println(" person 对象:"+taskService.getVariable("32502","person 对象").toString());
System.out.println(" confirm:"+taskService.getVariable("32506","confirm").toString());
}
public class Person implements Serializable{
private static final long serialVersionUID = -5708665422549573854L;
private Integer id;//编号
private String name;//姓名
private String education;
public Person(Integer id, String name, String education) {
this.id = id;
this.name = name;
this.education = education;
}
public Person() {
}
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;
}
public String getEducation() {
return education;
}
public void setEducation(String education) {
this.education = education;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", education='" + education + '\'' +
'}';
}
}
插播一个 idea 生产 serialVersionUID,请参考idea 类型中
https://blog.csdn.net/zhuchunyan_aijia/article/details/101297710
2:扩展知识:setVariable和setVariableLocal的区别
setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值
setVariableLocal:
1:设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到TASK_ID的字段会存放任务ID的值
例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。
2:还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。