Spring Batch单作业单步骤中使用多Reader的实现方案问询
Spring Batch单步骤处理多文件并分配独立Reader的解决方案
你提到的需求可以通过Spring Batch的MultiResourceItemReader实现,虽然它是一个顶层Reader,但内部会为每个目标文件创建独立的子Reader实例,同时支持自定义资源排序逻辑,完全满足你先处理新加坡(sg)文件、后处理马来西亚(my)文件,且同一国家下alternate文件优先的要求。
核心实现步骤
自定义资源排序器
实现Comparator<Resource>接口,按照你的优先级规则对文件排序:public class CountryPriorityResourceComparator implements Comparator<Resource> { @Override public int compare(Resource r1, Resource r2) { String fileName1 = r1.getFilename(); String fileName2 = r2.getFilename(); // 第一步:按国家代码排序,sg文件优先于my文件 boolean isSgFile1 = fileName1.contains("sg"); boolean isSgFile2 = fileName2.contains("sg"); if (isSgFile1 && !isSgFile2) { return -1; } else if (!isSgFile1 && isSgFile2) { return 1; } // 第二步:同一国家下,alternate文件优先 boolean isAlternate1 = fileName1.contains("alternate"); boolean isAlternate2 = fileName2.contains("alternate"); if (isAlternate1 && !isAlternate2) { return -1; } else if (!isAlternate1 && isAlternate2) { return 1; } // 其他情况按文件名自然排序 return fileName1.compareTo(fileName2); } }配置MultiResourceItemReader
把JSON文件Reader作为delegate传给MultiResourceItemReader,并绑定自定义排序器:@Bean public MultiResourceItemReader<YourBusinessEntity> multiResourceJsonReader() { MultiResourceItemReader<YourBusinessEntity> reader = new MultiResourceItemReader<>(); // 指定目标文件夹下的所有JSON文件,可通过PathMatchingResourcePatternResolver获取 reader.setResources(new PathMatchingResourcePatternResolver().getResources("file:/your/target/folder/*.json")); // 设置处理单个JSON文件的子Reader(每个文件会创建独立实例) reader.setDelegate(singleJsonItemReader()); // 绑定自定义排序器,确保文件处理顺序符合要求 reader.setComparator(new CountryPriorityResourceComparator()); // 允许文件夹为空时作业正常启动(根据业务需求调整) reader.setStrict(false); return reader; } @Bean public JacksonJsonItemReader<YourBusinessEntity> singleJsonItemReader() { JacksonJsonItemReader<YourBusinessEntity> jsonReader = new JacksonJsonItemReader<>(); // 设置JSON对应的实体类 jsonReader.setType(YourBusinessEntity.class); // 可配置自定义ObjectMapper处理特殊JSON格式 // jsonReader.setObjectMapper(customObjectMapper()); return jsonReader; }配置单步骤作业
把上述Reader绑定到步骤中,结合Writer完成数据库写入:@Bean public Step fileToDbStep(StepBuilderFactory stepBuilderFactory, MultiResourceItemReader<YourBusinessEntity> reader, ItemWriter<YourBusinessEntity> dbWriter) { return stepBuilderFactory.get("fileToDbStep") .<YourBusinessEntity, YourBusinessEntity>chunk(100) // 根据业务调整chunk大小 .reader(reader) .writer(dbWriter) .build(); }
关键说明
MultiResourceItemReader会为每个文件创建独立的JacksonJsonItemReader实例,完全符合你“每个文件分配独立Reader”的要求;- 通过自定义排序器严格控制文件处理顺序,无需额外步骤拆分;
- 整个逻辑在单个步骤内完成,满足你“同一个作业的单步骤”需求。
内容的提问来源于stack exchange,提问作者Malik Yawar
相关产品推荐
相关产品推荐

