瞬态变量

瞬态变量是行为与常规变量类似但不持久的变量,通常,瞬时变量用于高级用例。

以下内容适用于瞬态变量:

  • 瞬态变量根本没有存储任何历史记录。
  • 与常规变量一样,瞬态变量在设置时放在最高父级上,这意味着在执行中设置变量时,瞬态变量实际上存储在流程实例执行中,与常规变量一样,如果应在特定执行或任务上设置变量,则该方法存在局部变量。
  • 只能在流程定义中的下一个等待状态之前访问瞬态变量,之后,它们将消失,等待状态是指流程实例中将其持久存储到数据存储中的点,请注意,在此定义中,异步活动也是等待状态!
  • 只能通过setTransientVariable(name, value)设置瞬态变量,但是在调用getVariable(name)时也会返回瞬态变量(也存在getTransientVariable(name),它仅检查瞬态变量),这样做的原因是使表达式的编写变得容易,并且使用变量的现有逻辑对这两种类型均适用。
  • 瞬态变量将具有相同名称的持久变量隐藏起来,这意味着当在流程实例上同时设置持久变量和瞬态变量并且使用了getVariable("someVariable")时,将返回瞬态变量值。

瞬态变量可以在暴露常规变量的大多数地方获得和/或设置:

  • JavaDelegate实现中的DelegateExecution
  • ExecutionListener实现中的DelegateExecution和在TaskListener实现中的DelegateTask
  • 通过执行对象在脚本任务中。
  • 通过运行时服务启动流程实例时。
  • 完成任务时。
  • 调用runtimeService.trigger方法时。

这些方法遵循常规流程变量的命名约定:

void setTransientVariable(String variableName, Object variableValue);
void setTransientVariableLocal(String variableName, Object variableValue);
void setTransientVariables(Map<String, Object> transientVariables);
void setTransientVariablesLocal(Map<String, Object> transientVariables);

Object getTransientVariable(String variableName);
Object getTransientVariableLocal(String variableName);

Map<String, Object> getTransientVariables();
Map<String, Object> getTransientVariablesLocal();

void removeTransientVariable(String variableName);
void removeTransientVariableLocal(String variableName);

下面的BPMN图显示了一个典型示例:

api.transient.variable.example.png

假设Fetch Data服务任务调用一些远程服务(例如,使用REST),我们还假设启动流程实例时需要并需要提供一些配置参数,同样,这些配置参数对于历史审核目的也不重要,因此我们将它们作为瞬态变量传递:

ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
       .processDefinitionKey("someKey")
       .transientVariable("configParam01", "A")
       .transientVariable("configParam02", "B")
       .transientVariable("configParam03", "C")
       .start();

请注意,在达到用户任务并将其持久化到数据库之前,变量将一直可用,例如,在Additional Work用户任务中,它们不再可用,另请注意,如果提取数据本来是异步的,那么在该步骤之后它们也将不可用。

Fetch Data(简化)可能类似于:

public static class FetchDataServiceTask implements JavaDelegate {
  public void execute(DelegateExecution execution) {
    String configParam01 = (String) execution.getVariable(configParam01);
    // ...

    RestReponse restResponse = executeRestCall();
    execution.setTransientVariable("response", restResponse.getBody());
    execution.setTransientVariable("status", restResponse.getStatus());
  }
}

Process Data将获取响应瞬态变量,对其进行解析并将相关数据存储在实际的流程变量中,以备稍后使用。

离开独占网关的序列流条件不考虑使用持久变量还是瞬态变量(在这种情况下是状态瞬态变量):

<conditionExpression xsi:type="tFormalExpression">${status == 200}</conditionExpression>


博弈
2.5k 声望1.5k 粉丝

态度决定一切


引用和评论

0 条评论