在Camunda中使用Call Activity传递变量及Spring Boot代码实现流程传参
在Camunda中通过Call Activity实现流程间变量传递(Spring Boot + Java)
一、Call Activity配置层面的变量传递
Camunda Modeler可视化配置是最常用的方式,核心是输入/输出变量映射:
- 输入变量映射:将父流程变量传递给子流程。在Call Activity的「Input/Output」标签页,添加输入变量:
- 子流程变量名:比如
childOrderId - 赋值表达式:直接引用父流程变量
${orderId},或用Juel表达式处理(如${'PREFIX-' + orderId}) - 可选:勾选「All variables」可传递父流程所有变量,但不推荐——显式映射更清晰,避免不必要的变量泄露
- 子流程变量名:比如
- 输出变量映射:子流程结束后将结果传回父流程。同样在「Input/Output」标签页添加输出变量:
- 父流程变量名:比如
finalPaymentStatus - 赋值表达式:引用子流程变量
${paymentResult}
- 父流程变量名:比如
二、代码层面的流程间数据传递实现
1. 手动启动子流程时传递变量
通过Camunda RuntimeService直接启动子流程并注入变量,适合不需要可视化配置Call Activity的场景:
@Autowired private RuntimeService runtimeService; public void startChildProcess(String parentOrderId, BigDecimal amount) { Map<String, Object> childVars = new HashMap<>(); // 传递原始变量或处理后的变量 childVars.put("childOrderId", "CHILD-" + parentOrderId); childVars.put("transactionAmount", amount); // 启动子流程实例 runtimeService.createProcessInstanceByKey("child-payment-process") .setVariables(childVars) .execute(); }
2. Delegate中预处理变量再传递
在父流程的Service Task里通过JavaDelegate处理变量,再传递给后续的Call Activity:
@Component public class PrepareChildVarsDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) throws Exception { // 从父流程获取变量 String orderId = (String) execution.getVariable("orderId"); Integer quantity = (Integer) execution.getVariable("productQuantity"); // 业务处理:计算子流程需要的变量 BigDecimal totalAmount = new BigDecimal(99.99).multiply(new BigDecimal(quantity)); // 设置变量到父流程执行上下文,供Call Activity使用 execution.setVariable("childTotalAmount", totalAmount); } }
将这个Delegate绑定到Call Activity前的Service Task,Call Activity就能直接映射childTotalAmount到子流程。
3. 子流程结束后主动回传变量
通过ExecutionListener监听子流程的结束事件,手动将变量同步到父流程:
@Component public class ChildProcessCompletionListener implements ExecutionListener { @Autowired private RuntimeService runtimeService; @Override public void notify(DelegateExecution execution) throws Exception { // 获取子流程执行结果 String paymentStatus = (String) execution.getVariable("paymentStatus"); // Call Activity会自动将父流程执行ID存入子流程的`parentExecutionId`变量 String parentExecId = (String) execution.getVariable("parentExecutionId"); // 将结果设置到父流程 runtimeService.setVariable(parentExecId, "orderPaymentStatus", paymentStatus); } }
在Camunda Modeler中,给子流程的「End Event」添加执行监听器,选择这个类即可。
关键注意事项
- 变量类型兼容性:确保父/子流程变量的类型一致(如
BigDecimal而非Double),避免序列化/反序列化异常 - 局部变量使用:如果变量仅需在Call Activity范围内传递,用
execution.setVariableLocal()设置局部变量,防止影响其他流程节点 - 避免循环依赖:若子流程需回调父流程,明确变量传递的边界,防止出现循环调用导致的变量溢出
内容的提问来源于stack exchange,提问作者Hello
相关产品推荐
相关产品推荐

