无需在模型中声明成员,如何在任务间传递对象与变量?
任务间传递对象/变量(无需在流程模型中声明)
针对你的两个问题,核心诉求都是**不用修改流程模型(不用提前声明变量/成员)**就实现任务间的数据传递——从你提到的process、activation这些对象来看,应该是用Activiti或Camunda这类BPMN流程引擎吧?下面给你几个实用的方案:
1. 任务局部变量(Task Local Variables)
任务局部变量是绑定到单个任务实例的变量,不属于流程实例级别,因此完全不需要在流程模型里提前定义。
- 设置变量:在当前任务的执行逻辑里,通过任务对象设置局部变量:
// 先获取当前任务实例 Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult(); // 把对象存入当前任务的局部变量 taskService.setVariableLocal(currentTask.getId(), "transferredObject", yourCustomObject); - 获取变量:在后续任务中,只要能找到对应的前置任务实例,就能取出变量:
// 比如通过流程实例ID+前置任务的定义Key查询 Task previousTask = taskService.createTaskQuery() .processInstanceId(currentExecution.getProcessInstanceId()) .taskDefinitionKey("previousTaskKey") .singleResult(); YourCustomObject obj = (YourCustomObject) taskService.getVariableLocal(previousTask.getId(), "transferredObject"); - 小提示:局部变量只属于当前任务,不会自动同步到流程实例;如果是顺序执行的任务,也可以在前置任务完成前,把局部变量转存到执行实例的临时变量里,操作更灵活。
2. 执行实例临时变量(Transient Variables)
临时变量是流程执行实例的非持久化变量,不会存到数据库,也不需要在流程模型里声明,特别适合临时传递小对象。
- 设置变量:在当前任务的执行逻辑中,通过执行实例设置:
// 假设你拿到了当前任务对应的Execution实例 execution.setTransientVariable("tempObject", yourCustomObject); - 获取变量:后续任务直接从执行实例里取就行:
YourCustomObject obj = (YourCustomObject) execution.getTransientVariable("tempObject"); - 注意:临时变量不会被持久化,所以如果流程挂起、重启或者走了异步任务,这个变量就会丢失——适合短期、同步的任务间传递场景。
3. 外部存储+业务ID传递
如果你的对象比较大,或者需要长期保留,完全可以把对象放到流程引擎外部的存储(比如Redis、自定义数据库表),然后只传递对象的唯一ID,后续任务用ID从外部存储里捞对象。
- 步骤示例:
- 当前任务中存对象拿ID:
// 把对象存入自定义存储服务 String objectId = customStorageService.save(yourCustomObject); // 把ID存到任务局部变量(还是不用改模型) taskService.setVariableLocal(currentTask.getId(), "objectId", objectId); - 后续任务中取ID拿对象:
String objectId = (String) taskService.getVariableLocal(previousTask.getId(), "objectId"); YourCustomObject obj = customStorageService.getById(objectId);
- 当前任务中存对象拿ID:
- 小提示:这种方法需要你自己维护外部存储的生命周期(比如定时清理无用对象),但好处是完全脱离流程引擎的变量机制,彻底不用碰流程模型。
总结
如果是短期小对象传递,优先选临时变量或任务局部变量;如果是大对象或需要持久化的场景,用外部存储+ID传递。这三种方案都不需要在流程模型里声明任何变量/成员,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Siddharth Kulshreshtha
相关产品推荐
相关产品推荐

