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说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值