設置和獲取變量的方法
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說明流程變量綁定了當前的任務,當流程繼續執行時,下個任務獲取不到這個流程變量(因爲正在執行的流程變量中沒有這個數據),所有查詢正在執行的任務時不能查詢到我們需要的數據,此時需要查詢歷史的流程變量。