Spring Batch chunk步骤ItemWriter逻辑未执行问题排查
问题根因
你的作业从始至终没有被实际执行,控制台输出的starting job、XLS READER!!!、Into the writer!!全是Spring容器初始化Bean阶段的打印,完全没进入作业运行的流程。
从日志可以直接验证:全程没有Spring Batch作业启动、Step执行的标准日志输出,应用启动完成后直接触发关闭钩子退出JVM,自然不会执行到ItemWriter的write方法。
核心诱因有两个:
- 你没有主动触发作业执行,且主类结构存在问题:
main方法写在JobConfig类外部,日志显示实际启动的主类是SpringBatchApplication,就算配置被扫描到,Spring Boot的自动作业启动逻辑如果没有正确匹配到你的Job,也不会主动执行。 - 你使用的
PoiItemReader没有调用初始化方法,就算作业跑起来,也会因为Reader未完成初始化读不到任何数据,不会触发Writer的写入逻辑。
修复方案
- 调整主类结构,将main方法移入
JobConfig类内部,启动后手动通过JobLauncher触发作业执行,避免自动配置匹配失败的问题:
@SpringBootApplication @EnableBatchProcessing public class JobConfig { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; public JobConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) { this.jobBuilderFactory = jobBuilderFactory; this.stepBuilderFactory = stepBuilderFactory; } public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(JobConfig.class, args); JobLauncher jobLauncher = context.getBean(JobLauncher.class); Job targetJob = context.getBean("readFromExcelJob", Job.class); // 手动触发作业执行,传入空参数 jobLauncher.run(targetJob, new JobParameters()); } // 原有ItemReader、ItemWriter、Step、Job的Bean定义保留 }
- 修正
PoiItemReader的配置,补充初始化调用,同时替换资源加载方式避免路径找不到的问题:
@Bean public ItemReader<Students> xlsItemReader() throws Exception { PoiItemReader<Students> itemReader = new PoiItemReader<>(); itemReader.setName("xlsItemReader"); itemReader.setLinesToSkip(1); // 用ClassPathResource替代FileSystemResource,直接读取resources目录下的文件,不受工作目录影响 itemReader.setResource(new ClassPathResource("ResumptionStatus.xls")); BeanWrapperRowMapper<Students> studentsRowMapper = new BeanWrapperRowMapper<>(); studentsRowMapper.setTargetType(Students.class); itemReader.setRowMapper(studentsRowMapper); // 必须添加这行,完成Reader的内部初始化和参数校验,否则无法正常读取Excel行数据 itemReader.afterPropertiesSet(); System.out.println("XLS READER!!!"); return itemReader; }
结果验证
修复后重启应用,控制台会在原有Bean初始化打印之后,输出作业执行的标准日志,随后触发Writer的打印逻辑:
INFO --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=readFromExcelJob]] launched with the following parameters: [{}] INFO --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [readFromExcelChunkStep] Received a list of size 5 Students(Matno=xxx, College=xxx, ...) ...
如果还是没有输出,直接检查ResumptionStatus.xls文件是否存在、跳过1行后是否有有效数据行即可。
内容的提问来源于stack exchange,提问作者lookfarnot
相关产品推荐
相关产品推荐

