Flowable API 瞬时变量
瞬时变量(Transient variable)类似普通变量,只是不会被持久化。
通常来讲,瞬时变量用于高级使用场景。
如果不明确,还是使用普通流程变量为好。
瞬时变量具有下列特性:
- 瞬时变量完全不存储历史
- 与普通变量类似,设置瞬时变量时会存入最上层父中。这意味着在一个执行中设置一个变量时,瞬时变量实际上会存储在流程实例执行中。与变通变量类似,可以使用局部(local)的对应方法,将变量设置为某个执行或任务的局部变量。
- 瞬时变量只能在下一个等待状态之前访问。之后该变量即消失。等待状态意味着流程实例会持久化至数据存储中。请注意在这个定义中,异步活动也是等待状态。
- 只能使用setTransientVariable(name,value)设置瞬时变量,但是调用getVariable(name)也会返回瞬时变量(也有getTransientVariable(name)方法,它只返回瞬时变量)。这是为了简化表达式的撰写,并保证已有逻辑可以使用这两种类型的变量。
- 瞬时变量屏蔽(shadow)同名的持久化变量。也就是说当一个流程实例中设置了同名的持久化变量与瞬时变量时,getVariable("someVariable")会返回瞬时变量的值。
在大多数可以使用普通变量的地方,都可以获取、设置瞬时变量:
- 在JavaDelegate实现中的DelegateExecution内
- 在ExecutionListener实现中的DelegateExecution内,以及在TaskListener实现中的Delegate内
- 通常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流程图展示了一个典型的例子
假设Fetch Data任务调用某个远程服务(例如使用Rest),也假设需要其一些配置参数,并需要在启动流程实例时提供。同时,这些配置参数对于历史审计并不重要,因此我们将它们作为瞬时变量传递:
ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder() .processDefinitionKey("someKey") .transientVariable("configParam01", "A") .transientVariable("configParam02", "B") .transientVariable("configParam03", "C") .start();
请注意在到达用户任务并持久化之前,都可以使用这些瞬时变量。例如,在Additonal 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> |