先来看一条粗糙的流程(仅供学习使用)
流程图结构分析:
1. 流程启动 -> 流程结束 是一个完整的流程
2. 在 提交贷款申请和放款 两个任务节点之间存在两个分支流程
3. 整个流程中存在4个任务节点
变量作用域
在整个流程中,变量存在3个作用域
全流程可见、仅分支流程内可见、仅任务内可见
全流程可见:即流程内部任何地方都可见
仅分支流程可见: 即分支流程内部任何地方可见,分支外部不可见
仅任务内可见: 即指定任务可见,任务外部其它地方均不可见
变量设置
启动流程时设置变量
//变量全流程可见
runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
完成任务时设置变量
//变量全流程可见
taskService.complete(taskId, variable);
动态设置变量
//设置变量到流程中,全流程可见taskService.setVariable(taskId, variableName, value);//设置变量到任务中,仅任务可见taskService.setVariableLocal(taskId, variableName, value);
//设置变量到流程中,若executionId为分支流程,则该变量仅指定分支流程内部可见,否则全流程可见runtimeService.setVariableLocal(executionId, variableName, value);//设置变量到流程中,全流程可见runtimeService.setVariable(executionId, variableName, value);
Activiti
提供两张表保存变量值,ACT_RU_VARIABLE
保存流程在运行中需要的变量(即全流程可见的),ACT_HI_VARINST
保存流程的历史变量(三个作用域的变量都会保存在这个表中)
当插入变量时,若该变量为全流程可见的变量,则在两个表中分别新增一条记录,若相同作用域中存在同名变量,则后插入的变量值会覆盖先插入的变量值;若该变量为分支流程内可见或任务内可见,则仅在历史变量表中新增该变量。
当流程结束后,该流程在ACT_RU_VARIABLE
中保存的变量则会被清除,而ACT_HI_VARINST
中保存的变量并不会被清除。
对比 图1、图2 全流程可见的变量会同时在两个表中插入
对比 图3、图4 任务变量仅保存在
ACT_HI_VARINST
表中,
TASK_ID_
保存该任务的任务ID
图4 第一条记录和倒数第三条记录 对应的
EXECUTION_ID_
分别为
727865c5-5b0f-11e8-b8c9-ba4da3f11ae4
、
727865c4-5b0f-11e8-b8c9-ba4da3f11ae4
,这两条记录中保存的变量为分支流程可见,其为调用
runtimeService.setVariableLocal(executionId, variableName, value);
插入的
同一作用域内的同名变量会被后插入的覆盖
关于变量的使用场景
全流程可见的变量
在业务系统中可能存在需要根据业务数据查询流程信息(代办/已办)的需求,我们可以将用于查询条件的业务数据在流程实例启动的时候保存到流程变量中,在查询时关联ACT_HI_VARINST
表即可获取PROC_INST_ID_
、EXECUTION_ID_
,进而获取所需要的信息
任务内可见变量
由于该变量适合具体的任务挂钩的,所以可以保存该任务所特有的信息。最常见的是在完成任务时需要填写备注(意见)信息,多个任务的备注信息不能相互干扰,故将备注信息与具体的任务绑定以达到彼此间的互不干扰