返回介绍

4.5. 瞬时变量

发布于 2023-09-17 23:40:35 字数 3322 浏览 0 评论 0 收藏 0

瞬时变量(Transient variable)类似普通变量,只是不会被持久化。通常来说,瞬时变量用于高级使用场景。如果不明确,还是使用普通流程变量为好。

瞬时变量具有下列特性:

  • 瞬时变量完全不存储历史。

  • 普通变量类似,设置瞬时变量时会存入最上层父中。这意味着在一个执行中设置一个变量时,瞬时变量实际上会存储在流程实例执行中。与普通变量类似,可以使用局部(local)的对应方法,将变量设置为某个执行或任务的局部变量。

  • 瞬时变量只能在下一个“等待状态”之前访问。之后该变量即消失。等待状态意味着流程实例会持久化至数据存储中。请注意在这个定义中,异步活动也是“等待状态”!

  • 只能使用setTransientVariable(name, value)设置瞬时变量,但是调用getVariable(name)也会返回瞬时变量(也有getTransientVariable(name)方法,它只会返回瞬时变量)。这是为了简化表达式的撰写,并保证已有逻辑可以使用这两种类型的变量。

  • 瞬时变量屏蔽(shadow)同名的持久化变量。也就是说当一个流程实例中设置了同名的持久化变量与瞬时变量时,getVariable("someVariable")会返回瞬时变量的值。

在大多数可以使用普通变量的地方,都可以获取、设置瞬时变量:

  • JavaDelegate实现中的DelegateExecution

  • ExecutionListener实现中的DelegateExecution内,以及在TaskListener实现中的DelegateTask

  • 通过execution对象在脚本任务内

  • 通过RuntimeService启动流程实例时

  • 完成任务时

  • 调用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

假设’Fetch Data(获取数据)'服务任务调用某个远程服务(例如使用REST)。也假设需要其需要一些配置参数,并需要在启动流程实例时提供。同时,这些配置参数对于历史审计并不重要,因此我们将它们作为瞬时变量传递:

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

请注意在到达用户任务并持久化之前,都可以使用这些瞬时变量。例如,在’Additional Work(额外工作)'用户任务中它们就不再可用。也请注意如果’Fetch Data’是异步的,则瞬时变量在该步骤之后也不再可用。

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(处理数据)'可以获取response瞬时变量,解析并将其相关数据存储在实际流程变量中,因为之后还需要使用它们。

离开排他网关的顺序流上的条件表达式,不关注使用的是持久化还是瞬时变量(在这个例子中status是瞬时变量):

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文