【问题标题】:spring batch read from multiple files and write to one filespring批量读取多个文件并写入一个文件
【发布时间】:2020-10-06 12:33:45
【问题描述】:

我有从多个文件读取并写入多个文件的弹簧批处理配置。是否可以只写入一个从多个读取的文件。假设我收到巨大的 XML 文件,我将 XML 拆分为小文件并使用分区器并并行读取小文件。但我需要将从不同的小型 xml 文件读取的所有数据写入一个输出文件。春季批次可以做到这一点吗?我知道可以通过使编写器同步来实现,但我正在寻找任何其他可能的方式 作业配置

@Bean
    public Job job(final Step parser) {
        return jobBuilderFactory.get("JOB")
                .flow(parser)
                .end()
                .build();
    }

    @Bean
    public Step parser(final Step parserWorker, final Partitioner partitioner) {
        return stepBuilderFactory.get("parser")
                .partitioner("parser", partitioner)
                .step(parserWorker)
                .taskExecutor(taskExecutor())
                .build();
    }

    @Bean
    public Step parserWorker(
            final StaxEventItemReader reader,
            final FlatFileItemWriter<Employee> writer) {
        return stepBuilderFactory.get("parserWorker")
                .<Employee, Employee>chunk(Integer.parseInt(chunkSize))
                .reader(reader)
                .writer(writer)
                .build();
    }

    @Bean
    @StepScope
    public StaxEventItemReader<Employee> reader(final @Value("file:#{stepExecutionContext[file]}") Resource resource) {
        StaxEventItemReader<Employee> staxEventItemReader = new StaxEventItemReader<>();
        staxEventItemReader.setResource(resource);
        staxEventItemReader.setFragmentRootElementName("Employee");
        Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
        unMarshaller.setClassesToBeBound(Employee.class);
        staxEventItemReader.setUnmarshaller(unMarshaller);
        return staxEventItemReader;
    }

    @Bean()
    public FlatFileItemWriter<Employee> fileWriter() {
        FlatFileItemWriter<Employee> fileWriter = new FlatFileItemWriter<>();
        fileWriter.setResource(new FileSystemResource("out.csv"));
        EmployeeAggregator lineAggregator = new EmployeeAggregator();
        fileWriter.setLineAggregator(lineAggregator);
        fileWriter.setLineSeparator(EMPTY_STRING);
        fileWriter.setHeaderCallback(new HeaderCallback());
        fileWriter.setFooterCallback(new FooterCallback());
        return innlesFileWriter;
    }

我收到错误org.springframework.batch.item.ItemStreamException: Output file was not created:

【问题讨论】:

  • 当您经过out.csv 时,它已经存在了吗?你可以看看https://howtodoinjava.com/spring-batch/flatfileitemwriter-write-to-csv-file/#demo
  • 生成多个文件并合并它们对我不起作用,因为页脚
  • 哪个页脚?您的描述中没有提到这一点,并且您的配置中没有 FooterCallback。请在您的问题中添加所有详细信息,以便能够以有效的方式为您提供正确的答案。
  • 我现在更新了问题
  • 如果页脚是阻止并行的原因,我会在单独的步骤中将其附加到最终文件中。否则,请使用答案中提到的暂存区。

标签: java spring-batch


【解决方案1】:

我有从多个文件读取并写入多个文件的 spring 批处理配置。

您可以创建一个合并输出文件的附加步骤。由于输出文件是平面文件,因此可以毫无问题地完成此操作(如果输出文件是 XML 文件,则问题会更大,因为在合并文件时需要处理 XML 声明、标头等)。

另一种技术是使用暂存区(表、队列等)并添加一个从暂存区读取并写入最终文件的步骤。

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2018-07-15
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多