流程变量作用域记录
- 流程变量作用域和当前活动ID识别目标作用域,当前活动ID可能是执行器ID、或多实例ID,具体需看具体流程分支。
execution.setVariable()
会在当前活动ID(执行器ID)下记录变量,如果当前执行器有父执行器ID会写入到父执行器ID下。这也就是在子流程中设置的变量在父流程中可获取到的原因。父执行器下的变量共享到子执行器下的变量。execution.setVariableLocal()
local可直接指定当前变量作用域,写入变量时,会直接写入到当前执行器ID下,不会找父执行器。这也就是在子流程中设置的变量,在父流程中获取不到。通常用于子流程中设置的变量,只在子流程中使用,不让暴露到父流程中- 瞬时变量,只会在当前事务中有效,事务提交后就会被删除,不会存储到数据库中,不推荐使用。设置变量时,变量值类型时
TypedValue
类型,并且设置属性isTransient=true
时,此时的变量就是瞬时变量。execution.setVariable("task4_Transient",Variables.stringValue("444",true));
execution.setVariable()
和execution.setVariableLocal()
设置的变量名称一样,并且作用域一样时,会相互覆盖。- 变量作用域可通过表字段
act_ru_variable.var_scope_
、act_hi_varinst.act_inst_id_
或act_hi_detail.var_inst_id_
判断是否同一个作用域
案例流程变量作用域测试
定义一下groovy脚本,分别在流程脚本任务中设置变量、获取变量,打印变量输出,判断流程变量作用域。下面脚本只是案例,需要拆开分别设置到不同Task上
package cn.maitian.bss.hr.test.camunda.groovy
import org.camunda.bpm.engine.delegate.DelegateExecution
import org.camunda.bpm.engine.variable.Variables
import org.camunda.bpm.engine.variable.value.BooleanValue
/**
* Groovy脚本测试
*/
class GroovyTest {
public static void main(String[] args) {
//1、流程:变量作用域测试 Process_Varias_Test 流程变量作用域测试
//2、流程:流程变量作用域2 Process_Variable_Test2
DelegateExecution execution=null;
//任务1
String activityName=execution.currentActivityName;
println "当前任务名称:"+activityName+"--"+execution.processInstanceId+">>"+execution.currentTransitionId;
execution.setVariable("globalVariable","1");
execution.setVariableLocal("globalLocalVar","10");
BooleanValue booleanValue= Variables.booleanValue(true,true);
execution.setVariable("globalTransient",booleanValue);
//任务2
println "当前任务名称:"+execution.currentActivityName+"--"+execution.processInstanceId+">>"+execution.currentTransitionId;
execution.setVariable("task2_Variable","2");
execution.setVariableLocal("task2_LocalVar","20");
execution.setVariable("task2_Transient",Variables.stringValue("222",true));
println "globalVariable"+"--"+execution.getVariable("globalVariable")
println "globalLocalVar"+"--"+execution.getVariableLocal("globalLocalVar")
println "globalTransient"+"--"+execution.getVariable("globalTransient")
//任务3
println "当前任务名称:"+execution.currentActivityName+"--"+execution.processInstanceId+">>"+execution.currentTransitionId;
execution.setVariable("task3_Variable","3");
execution.setVariableLocal("task3_LocalVar","30");
execution.setVariable("task3_Transient",Variables.stringValue("333",true));
println "globalVariable"+"--"+execution.getVariable("globalVariable")
println "globalLocalVar"+"--"+execution.getVariableLocal("globalLocalVar")
println "globalTransient"+"--"+execution.getVariable("globalTransient")
println "task2_Variable"+"--"+execution.getVariable("task2_Variable")
println "task2_LocalVar"+"--"+execution.getVariableLocal("task2_LocalVar")
//任务4
println "当前任务名称:"+execution.currentActivityName+"--"+execution.processInstanceId+">>"+execution.currentTransitionId;
execution.setVariable("task4_Variable","4");
execution.setVariableLocal("task4_LocalVar","40");
execution.setVariable("task4_Transient",Variables.stringValue("444",true));
println "globalVariable"+"--"+execution.getVariable("globalVariable")
println "globalLocalVar"+"--"+execution.getVariableLocal("globalLocalVar")
println "globalTransient"+"--"+execution.getVariable("globalTransient")
println "task2_Variable"+"--"+execution.getVariable("task2_Variable")
println "task2_LocalVar"+"--"+execution.getVariableLocal("task2_LocalVar")
println "task2_Transient"+"--"+execution.getVariableLocal("task2_Transient")
println "task3_Variable"+"--"+execution.getVariable("task3_Variable")
println "task3_LocalVar"+"--"+execution.getVariableLocal("task3_LocalVar")
println "task3_Transient"+"--"+execution.getVariableLocal("task3_Transient")
}
}