public void debug() {
runtimeService.setVariable("813c8611-d270-11ec-a0e6-1a744dc35c6c", "name", "Debug");
}
protected void setVariables(String executionId, Map<String, ? extends Object> variables, boolean local) {
try {
// 通过CommandExecutor调用SetExecutionVariablesCmd
// 不明白Command模式的,可见 Engine调用链类图 调用关系
commandExecutor.execute(new SetExecutionVariablesCmd(executionId, variables, local));
} catch (ProcessEngineException ex) {
if (ExceptionUtil.checkValueTooLongException(ex)) {
throw new BadUserRequestException("Variable value is too long", ex);
}
throw ex;
}
}
AbstractVariableCmd#execute
public Void execute(CommandContext commandContext) {
this.commandContext = commandContext;
// 通过VariableScope
// Scope可以是Task、Execution、ProcessInstance粒度
// 本次Debug,调用的是:ExecutionEntity execution = commandContext
// .getExecutionManager()
// .findExecutionById(entityId);
AbstractVariableScope scope = getEntity();
// 执行设置变量
// 下面重点描述这个过程
executeOperation(scope);
// 主要是执行延时事件
// 常见场景:节点配置了条件事件,一旦变量发生变动,需要触发事件的执行
onSuccess(scope);
if(!preventLogUserOperation) {
logVariableOperation(scope);
}
return null;
};
AbstractVariableScope#setVariable
protected void setVariable(String variableName,
TypedValue value,
AbstractVariableScope sourceActivityVariableScope,
boolean skipJavaSerializationFormatCheck) {
// 如果是本地变量,则直接调用setVariableLocal,进行设置
if (hasVariableLocal(variableName)) {
setVariableLocal(variableName, value, sourceActivityVariableScope, skipJavaSerializationFormatCheck);
return;
}
// 非本地变量,则寻找父Scope,进行设置
// 此处是递归的过程
// 如果不明白何为父Scope,具体见“核心概念关系”篇,描述了ProcessInstance、Execution、Task关系
AbstractVariableScope parentVariableScope = getParentVariableScope();
if (parentVariableScope!=null) {
if (sourceActivityVariableScope==null) {
// 递归
parentVariableScope.setVariable(variableName, value, skipJavaSerializationFormatCheck);
} else {
// 递归
parentVariableScope.setVariable(variableName, value, sourceActivityVariableScope, skipJavaSerializationFormatCheck);
}
return;
}
// 本次Debug,是对Exection(并且Exection=ProcessInstance)进行设置,故进入到这个方法
setVariableLocal(variableName, value, sourceActivityVariableScope, skipJavaSerializationFormatCheck);
}
AbstractVariableScope#setVariableLocal
public void setVariableLocal(String variableName,
TypedValue value,
AbstractVariableScope sourceActivityExecution,
boolean skipJavaSerializationFormatCheck) {
if (!skipJavaSerializationFormatCheck) {
VariableUtil.checkJavaSerialization(variableName, value);
}
VariableStore<CoreVariableInstance> variableStore = getVariableStore();
// 变量已存在,进行Update过程
if (variableStore.containsKey(variableName)) {
// 非本次调用,省略具体方法
}
// 变量需要被删除,进行Delete过程
else if (!value.isTransient() && variableStore.isRemoved(variableName)) {
// 非本次调用,省略具体方法
// ...
}
// 变量需要被新增,进行Insert过程
// 本次Debug,就是进行新增
else {
CoreVariableInstance variableValue = getVariableInstanceFactory().build(variableName, value, value.isTransient());
getVariableStore().addVariable(variableValue);
// 此处是重点,通过VariableInstanceLifecycleListener扩展,进行具体的逻辑操作
invokeVariableLifecycleListenersCreate(variableValue, sourceActivityExecution);
}
}
VariableInstanceEntityPersistenceListener