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

Camunda Spring Boot外部任务无法并行执行且无法自动完成问题求助

问题根因说明

你配置的spring.task.execution和spring.task.scheduling线程池是Spring原生的任务调度/执行组件的配置,不会作用于Camunda外部任务客户端的独立工作线程池,这是任务无法并行的核心原因。而任务直到应用关闭才完成,通常是Camunda事务未正常提交、或外部任务客户端参数配置错误导致。

具体解决方案

1. 修正Camunda外部任务客户端配置

在application.yml中添加Camunda专属的外部任务配置,原有Spring线程池配置可以保留但对该问题无效:

camunda:
  bpm:
    external-task:
      # 开启外部任务自动订阅
      enabled: true
      client:
        # 单次拉取的最大任务数,根据业务需要调整
        max-tasks: 10
        # 工作线程数,直接控制并行度,和你需要的并发数匹配即可
        worker-threads: 10
        # 任务锁定时长,单位毫秒,需要大于你单任务的最长执行时间,避免被其他worker抢锁
        lock-duration: 60000
        # 无需长轮询可设为0,避免长连接导致的提交延迟
        async-response-timeout: 0
        # 拉取任务的间隔时间,单位毫秒
        backoff: 1000

2. 修复任务未正常提交的问题

按以下顺序检查调整:

  • 不要给ExternalTaskHandler的execute方法加全局@Transactional注解:你的业务JDBC用的是独立的amlDataSourceJdbcTemplate数据源,和Camunda的数据源不是同一个,跨数据源的全局事务会导致Camunda的complete操作被挂起,直到应用销毁时才批量提交悬而未决的事务。
  • 如果需要对业务JDBC操作做事务控制,可以单独封装业务方法,给业务方法加对应数据源的事务注解,不要包裹Camunda的complete调用:
@Component
@ExternalTaskSubscription("getCustomers")
public class GetCustomers implements ExternalTaskHandler {

    @Resource(name = "amlDataSourceJdbcTemplate")
    private JdbcTemplate jdbc;

    public void execute(ExternalTask externalTask, ExternalTaskService externalTaskService) {
        Logger.getLogger("GetCustomers").log(Level.INFO, "worker: GetCustomers started" );
        List<String> customersList = businessQuery();
        VariableMap variables = Variables.createVariables();
        variables.put(Common.VAR_NAME_CUSTOMERS_LIST, customersList);
        Logger.getLogger("GetCustomers").log(Level.INFO, "worker: GetCustomers finished" );
        externalTaskService.complete(externalTask, variables);
        Logger.getLogger("GetCustomers").log(Level.INFO, "worker: GetCustomers Task completed" );
    }

    // 单独给业务查询加对应数据源的事务控制,不影响Camunda操作
    @Transactional(transactionManager = "amlDataSourceTransactionManager", rollbackFor = Exception.class)
    public List<String> businessQuery(){
        String sql = "SELECT cust_i_id FROM CUSTOMERS";
        return jdbc.query(sql, (rs, rowNum) -> rs.getString("cust_i_id"));
    }
}
  • 确认你的Camunda服务端和客户端依赖版本完全一致,版本不兼容也会出现complete调用不生效的问题。

3. 额外校验点

  • 检查流程定义中对应外部任务的异步_before/异步_after配置,无特殊需要可以关闭,避免额外的事务拦截。
  • 若有多个主题的外部任务处理器,无需单独配置线程池,统一由上述Camunda客户端配置管理线程即可。

内容的提问来源于stack exchange,提问作者Nazim Fathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:54:03