Camunda中无需序列化设置瞬态Object变量的问题咨询
报错原因
你使用Variables.objectValue()API创建变量时,哪怕标记了瞬态属性,Camunda的变量处理逻辑依然会尝试为该对象匹配序列化器,这套API本身是为兼容可持久化变量设计的,所以会强制校验序列化能力,哪怕变量不会真的落盘。
无序列化实现瞬态变量的解决方案
方案1:直接使用瞬态变量设置API(推荐)
你的场景全是同步执行的Service Task,没有需要落盘的节点,直接使用专门的瞬态变量设置方法即可,不需要封装为TypedValue,也不需要目标类实现Serializable接口:
ProcessInstanceWithVariables process_res = runtimeService.createProcessInstanceByKey(param.getProcessKey()) // 直接使用setVariableTransient存储原始对象 .setVariableTransient("Param", new BpmContext()) .executeWithVariablesInReturn();
在Service Task中直接读取即可:
BpmContext context = (BpmContext) execution.getVariable("Param");
注意事项:如果你的流程配置了asyncBefore/asyncAfter等异步配置,瞬态变量会在异步节点调度时丢失,因为瞬态变量不会被持久化到数据库,仅存在于当前执行线程的上下文中。
方案2:自定义空序列化器(适配必须使用TypedValue的场景)
如果业务要求必须使用TypedValue封装变量,可以自定义一个针对瞬态对象的序列化器,跳过序列化/反序列化逻辑,直接返回原始对象即可,该方案改造成本较高,非必要不选择。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

