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

Spring Batch 5.12升级后服务器崩溃重启失败:Job未注册

Spring Batch 5.12升级后NoSuchJobException问题解决

场景回顾

我们的Spring Batch分区作业在服务器崩溃后会处于STARTED状态,此前通过将作业执行状态修改为FAILED,再调用jobOperator.restart(failedBatchExecutionId)即可重启作业处理待处理数据,使用的配置如下:

@Bean(name = "febpBatchJobRegistry")
public JobRegistry jobRegistry() throws Exception {
    return new MapJobRegistry();
}

@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(@Qualifier("febpBatchJobRegistry") JobRegistry jobRegistry) {
    JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
    postProcessor.setJobRegistry(jobRegistry);
    return postProcessor;
}

@Bean(name = "febpBatchJobOperator")
public JobOperator jobOperator(@Qualifier("febpBatchJobLauncher") JobLauncher jobLauncher, @Qualifier("febpBatchJobRepository") JobRepository jobRepository,
                               @Qualifier("febpBatchJobRegistry") JobRegistry jobRegistry, @Qualifier("febpBatchJobExplorer") JobExplorer jobExplorer) {
    final SimpleJobOperator jobOperator = new SimpleJobOperator();
    jobOperator.setJobLauncher(jobLauncher);
    jobOperator.setJobRepository(jobRepository);
    jobOperator.setJobRegistry(jobRegistry);
    jobOperator.setJobExplorer(jobExplorer);
    return jobOperator;
}

但升级到Spring Batch Core 5.12版本后,触发如下异常:

org.springframework.batch.core.launch.NoSuchJobException: No job configuration with the name [FEBP_EMP_TAX_CALCULATION] was registered at org.springframework.batch.core.configuration.support.MapJobRegistry.getJob(MapJobRegistry.java:68)

问题排查与解决方案

1. 修复@Bean注解大小写错误

检查代码中是否存在小写的@bean注解(示例中已修正为@Bean),Spring框架仅识别大写的@Bean来注册Bean,小写注解会导致JobRegistry和JobRegistryBeanPostProcessor无法被容器加载,进而无法完成Job的自动注册。

2. 适配Spring Batch 5.x的JobRegistryBeanPostProcessor行为

Spring Batch 5.x对JobRegistryBeanPostProcessor的自动扫描逻辑做了调整,默认仅注册顶级Job Bean。若你的分区作业是嵌套定义的,需显式开启自动候选扫描:

@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(@Qualifier("febpBatchJobRegistry") JobRegistry jobRegistry) {
    JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
    postProcessor.setJobRegistry(jobRegistry);
    postProcessor.setAutowireCandidate(true); // 开启全局Job Bean扫描
    return postProcessor;
}

3. 手动注册Job到JobRegistry

若自动注册仍不生效,可在Job定义时手动完成注册,确保Job被正确加入到MapJobRegistry中:

@Bean(name = "FEBP_EMP_TAX_CALCULATION")
public Job febpEmpTaxCalculationJob(JobRepository jobRepository, Step partitionStep) {
    Job job = new JobBuilder("FEBP_EMP_TAX_CALCULATION", jobRepository)
            .start(partitionStep)
            .build();
    // 手动注册Job到指定的JobRegistry
    febpBatchJobRegistry().register(new ReferenceJobFactory(job));
    return job;
}

4. 校验作业名称一致性

确认JobRegistry中注册的作业名称与数据库元数据中存储的作业名称完全一致(Spring Batch对作业名称大小写敏感),避免因名称不匹配导致找不到作业的情况。


内容的提问来源于stack exchange,提问作者Shreyas Holla P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:36:04