【问题标题】:Step freeze. PoiItemreader does not read excel file when the file is large. Any suggestion?步骤冻结。当文件很大时,PoiItemreader 不会读取 excel 文件。有什么建议吗?
【发布时间】:2020-05-12 12:27:22
【问题描述】:

我尝试在 Spring Batch 中使用 PoiItemreader 处理一个 excel 文件。当 excel 文件较小或正常大小时,程序成功运行。但是,当我尝试处理更大的文件(大于 12MB)时。该文件根本没有被读取。

我有以下问题:

  1. 使用 PoiItemreader 的文件大小有什么限制?
  2. 使用 MultiResourcePartioner 能否解决此问题?

非常感谢。

这是我的代码:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;
    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job csvProcessJob() throws FileNotFoundException {
        return jobBuilderFactory.get("csvProcessJob")
                .incrementer(new RunIdIncrementer())
                .flow(csvProcessStep())
                .end()
                .build();
    }

    @Bean
    public Step csvProcessStep() throws FileNotFoundException {
        return stepBuilderFactory.get("stepCSVprocess")
                .<String, Map<String, AttributeValue>> chunk(25)
                .reader(excelReader())
                .processor(processor())
                .writer(writer())
                .build();
    }

    @Bean
    public PoiItemReader excelReader() throws FileNotFoundException {
        PoiItemReader reader = new PoiItemReader();
        reader.setLinesToSkip(1);
        reader.setResource(new ClassPathResource("file_name.xls"));
        reader.setRowMapper(excelRowMapper());
        return reader;
    }

    private RowMapper<MetaData> excelRowMapper() {
        return new MetaDataRowMapper();
    }

    @Bean
    public ItemProcessor<MetaData,Map<String,AttributeValue>> processor() {
        return new MapProcessor();
    }

    @Bean
    public ItemWriter writer() {
        return new AWSwriter();
    }

【问题讨论】:

  • 假设您使用的是我创建的PoiItemReader,它确实有一次将所有内容加载到内存中的缺点。可悲的是,这就是 POI 的工作方式。有一种方法可以流式加载它,请参阅stackoverflow.com/questions/33786219/… 以获得灵感。我也在考虑实现一个流式阅读器,但问题是我手头的时间。
  • 非常感谢您的评论。我将按照引用的链接更新我发现的内容。您认为 multiResourcePartitioner 会起作用吗? @M。 Deinum
  • 多资源无济于事。它允许读取多个资源,就像它是一个单一的一样。它不会将单个文件拆分为多个较小的文件。

标签: java spring-boot spring-batch batch-processing spring-batch-excel


【解决方案1】:

更新我的问题,我按照评论中的链接作为 M. Deinum 帖子,并能够将其合并到我自己的自定义 itemreader。现在程序可以正常运行,但它只适用于 .xlsx 而不是 .xls

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多