You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:15:33