Flowable API 瞬时变量

本文深入探讨Flowable工作流引擎中的瞬时变量概念及其应用。瞬时变量用于高级场景,仅在流程执行中存在,不会被持久化,适用于不需要记录历史的配置参数。文章详细解释了瞬时变量的特性、如何在不同场景下使用以及与普通变量的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值