启动多个Spring Batch Job时报jobLauncher bean无法注册错误如何解决?
问题根因
- 当你在Spring Batch配置类上添加
@EnableBatchProcessing注解时,框架会自动向Spring容器注入一批默认核心组件Bean,其中就包含名为jobLauncher的SimpleJobLauncher实例。 - Spring Boot 2.1及后续版本默认将
spring.main.allow-bean-definition-overriding配置设为false,禁止同名Bean覆盖,因此你自定义的同名jobLauncherBean会和框架自动注册的Bean触发注册冲突。
解决方案
方法1:修改自定义JobLauncher的Bean名称,避免命名冲突
给自定义的JobLauncher Bean指定唯一别名,后续注入使用时通过@Qualifier指定对应实例即可,无需修改其他默认配置:// 配置类中定义自定义JobLauncher @Bean("customBatchJobLauncher") public JobLauncher customJobLauncher(JobRepository jobRepository, ThreadPoolTaskExecutor batchTaskExecutor) throws Exception { SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); jobLauncher.setJobRepository(jobRepository); jobLauncher.setTaskExecutor(batchTaskExecutor); jobLauncher.afterPropertiesSet(); return jobLauncher; }注入使用时指定Bean名:
@Autowired @Qualifier("customBatchJobLauncher") private JobLauncher jobLauncher;方法2:关闭框架默认JobLauncher注册(Spring Batch 5+适用)
如果你使用的是Spring Batch 5及以上版本,可以直接修改@EnableBatchProcessing注解的属性,关闭默认JobLauncher的自动注册,你的自定义同名Bean即可正常生效:@EnableBatchProcessing(useDefaultJobLauncher = false) @Configuration public class UpdateInfoBatchConfig { // 你的自定义Job、Step、JobLauncher配置 }方法3:开启Bean覆盖(不推荐生产环境使用)
你也可以在项目配置文件中放开Bean覆盖限制,让自定义Bean覆盖框架默认的同名Bean:# application.yml配置 spring: main: allow-bean-definition-overriding: true该配置会全局放开所有Bean的覆盖限制,可能引发未知的Bean替换问题,仅推荐本地调试临时使用。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

