Activiti学习之入门:流程变量(08)

一、流程变量

流程变量在 activiti 中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和 activiti
结合时少不了流程变量,流程变量就是 activiti 在管理工作流时根据管理需要而设置的变量。
比如在请假流程流转时如果请假天数大于 3 天则由总经理审核,否则由人事直接审核,请假天
数就可以设置为流程变量,在流程流转时使用。
注意:虽然流程变量中可以存储业务数据可以通过 activiti 的 api 查询流程变量从而实现 查询业务
数据,但是不建议这样使用,因为业务数据查询由业务系统负责,activiti 设置流程变量是为了流程执行需要而创建。

二、流程变量类型

在这里插入图片描述

三、流程变量作用域

流程变量的作用域默认是一个流程实例(processInstance),也可以是一个任务(task)或一个执行实例(execution),这三个作用域流程实例的范围最大,可以称为global变量,任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,称为local变量

  • global变量中变量名不允许重复,设置相同的名称的变量,后设置的值会覆盖前设置的变量值。
  • local变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。local变量名也可以和global变量名相同,没有影响。

四、流程变量的使用方法

  1. 可以在assignee处设置UEL表达式,表达式的值为任务的负责人。比如:${assignee}就是一个流程变量的名称。
  2. 可以在连线上设置UEL表达式,决定流程的走向。

五、使用Global变量控制流程

5.1、 需求

员工创建请假申请单,由部门经理审核,部门经理审核通过后请假 3 天及以下由人事经理直接
审核,3 天以上先由总经理审核,总经理审核通过再由人事经理存档。
在这里插入图片描述

5.2、 流程定义

在这里插入图片描述
!](https://i-blog.csdnimg.cn/direct/4ed93be41df84ea4a27ce1cc9a8cfcb9.png)

5.3、设置global流程变量

在请假流程重,变量值为请假信息(包括请假天数),流程的变量值会决定流程的走向。

5.3.1、启动流程时设置

在启动流程时,设置流程变量,变量的作用域是整个流程实例。
通过Map<key,value>设置流程,map重可以设置多个变量,key就是流程变量的名字。

 @Test
    public void test2(){
        //1、得到ProcessEngine
        ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
        //2、得到RuntimeService
        RuntimeService runtimeService=processEngine.getRuntimeService();
        //3、流程定义的key问题
        String key="holiday4";
        Map<String ,Object> map = new HashMap<String ,Object>();

        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        map.put("holiday",holiday);

        //4、启动流程实例,并且设置流程变量的值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map);

        //5、输出实例信息
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getProcessDefinitionId());
    }

说明:
startProcessInstanceByKey(processDefinitionKey, variables)流程变量作用域是一个流
程实例,流程变量使用 Map 存储,同一个流程实例设置变量 map 中 key 相同,后者覆盖前者。

5.3.2、任务办理时设置

在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用
域是整个流程实例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替
换前边设置的变量。

    //完成任务
    @Test
    public void test3(){
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户是否有任务
        String key = "myProcess_1";
        Task task = taskService.createTaskQuery().processDefinitionKey(key)
                .taskAssignee("zhangsan").singleResult();

        //初始化一些参数
        Map<String ,Object> map = new HashMap<String ,Object>();

        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        map.put("holiday",holiday);

        //4.判断task!=null,说明当前用户有任务
        if(task!=null){
            taskService.complete(task.getId(),map);//完成任务时,设置流程变量的值
            System.out.println("任务执行完毕");
        }
    }

说明:
通过当前任务设置流程变量,需要指定当前任务 id,如果当前执行的任务 id 不存在则抛出异常。
任务办理时也是通过 map<key,value>设置流程变量,一次可以设置多个变量。

5.3.3、通过当前流程实例设置

通过流程实例 id 设置全局变量,该流程实例必须未执行完成。

@Test
    public void test3(){
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RuntimeService
        RuntimeService runtimeService =  processEngine.getRuntimeService();

        //3.流程定义的key问题   myProcess_1
        //Map<String ,Object> map = new HashMap<>();

        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        // map.put("holiday",holiday);

        //4.通过实例id,来设置流程变量
        //第一个参数:流程实例的id
        //第二个参数:流程变量名
        //第三个变量:流程变量名,所对应的值
        runtimeService.setVariable("2501","holiday",holiday);
    }
注意:

executionId 必须当前未结束 流程实例的执行 id,通常此 id 设置流程实例 的 id。
也可以通过 runtimeService.getVariable()获取流程变量

5.3、注意事项

  1. 如果UEL表达式重流程变量名不存在则报错。
  2. 如果UEL表达式重流程变量值为空NULL,流程不按UEL表达式去执行,流程结束。
  3. 如果UEL表达式都不符合条件,流程结束。
  4. 如果连线不设置条件,会走flow序号小的那条线。

六、操作数据库

设置流程变量会在当前执行流程变量表插入记录,同时也会在历史流程变量表也插入记录。
SELECT * FROM act_ru_variable #当前流程变量表
记录当前运行流程实例可使用的流程变量,包括 global 和 local 变量
Id_:主键
Type_:变量类型
Name_:变量名称
Execution_id_:所属流程实例执行 id,global 和 local 变量都存储
Proc_inst_id_:所属流程实例 id,global 和 local 变量都存储
Task_id_:所属任务 id,local 变量存储
Bytearray_:serializable 类型变量存储对应 act_ge_bytearray 表的 id
Double_:double 类型变量值
Long_:long 类型变量值
Text_:text 类型变量值
SELECT * FROM act_hi_varinst #历史流程变量表
记录所有已创建的流程变量,包括 global 和 local 变量
字段意义参考当前流程变量表。

七、设置local流程变量

7.1 任务办理时设置

@Test
    public void test4(){
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户是否有任务
        String key = "holiday4";
        Task task = taskService.createTaskQuery().processDefinitionKey(key)
                .taskAssignee("zhangsan").singleResult();

        //初始化一些参数
        Map<String ,Object> map = new HashMap<String ,Object>();

        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        map.put("holiday",holiday);

        //4.判断task!=null,说明当前用户有任务
        if(task!=null){
            taskService.complete(task.getId(),map);//完成任务时,设置流程变量的值
            System.out.println("任务执行完毕");
        }
    }

说明:
设置作用域为任务的 local 变量,每个任务可以设置同名的变量,互不影响。
Local 变量在任务结束后无法在当前流程实例执行中使用,如果后续的流程执行需要用到此变量则会
报错

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值