瞬态变量
瞬态变量是行为与常规变量类似但不持久的变量,通常,瞬时变量用于高级用例。
以下内容适用于瞬态变量:
- 瞬态变量根本没有存储任何历史记录。
- 与常规变量一样,瞬态变量在设置时放在最高父级上,这意味着在执行中设置变量时,瞬态变量实际上存储在流程实例执行中,与常规变量一样,如果应在特定执行或任务上设置变量,则该方法存在局部变量。
- 只能在流程定义中的下一个等待状态之前访问瞬态变量,之后,它们将消失,等待状态是指流程实例中将其持久存储到数据存储中的点,请注意,在此定义中,异步活动也是等待状态!
- 只能通过
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图显示了一个典型示例:
假设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>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。