入口代码

public void debug() {
    runtimeService.setVariable("813c8611-d270-11ec-a0e6-1a744dc35c6c", "name", "Debug");
}

RuntimeService代码

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;
  }
}

Command代码

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;
};

Untitled

Untitled

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);
    }
  }

Untitled

VariableInstanceEntityPersistenceListener