activiti 流程變量

設置和獲取變量的方法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章