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
相关产品推荐
相关产品推荐

