当前位置: 首页 > 知识库问答 >
问题:

Spring批处理从多个文件读取并写入一个文件

梁渊
2023-03-14

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

@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;
    }

我得到错误组织。springframework。一批项目ItemStreamException:未创建输出文件:

共有1个答案

通远
2023-03-14

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

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

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

 类似资料:
  • CompositeItemWriter:当我需要将项目平均地分给Writer时,似乎会将所有读取的项目传递给所有的Writer。 BacktoBackPatternClassifier:我并不真正需要分类器,因为我是均匀地拆分项目。 有没有另一种方式,让一个读者和多个作者? 或者我可以在Writer中手动创建线程?

  • 我是Spring批处理的新手,目前正在处理一个新的批处理作业。我的批处理作业: 读取器:读取数据库中的记录(即5家公司的员工) 处理器:处理记录 5个writer:过滤并写入每个文件(即A公司的员工在A路径写入A公司文件,B公司的员工在B路径写入B公司文件),最后一个writer将A公司的所有离职员工写入D公司。 任务:将文件保存到数据库中。 目前,我正在使用CompositeItemWriter

  • 我需要从多个目录中读取文件,并处理数据并将其存储到DB中。目前我正在使用块多资源阅读器,它适用于1个目录。但现在我必须从多个目录中读取文件。如何使用Spring批处理来做到这一点

  • 我目前正在编写spring batch,在这里我读取一个XML数据,对其进行处理,然后将处理结果作为< code>map传递 生成用于编组和解组的JAXB xjc类。JAXB生成的类如下所示。 JAXB员工类 Spring XML配置文件 处理器和写入器: 问题: XML文件对于每个固定的提交间隔都是重写的,很明显,XML文件是在每个提交级别之后创建的。但我必须附加所有

  • 我有几个不同的Spring批处理作业需要写入同一个平面文件。在平面文件中写入数据的顺序并不重要。这些批处理作业可能同时运行。 FlatFileItemWriter是否合适?我担心的是,如果多个作业同时尝试写入平面文件,数据可能会混合在一起。

  • 我刚开始使用Spring批处理,我有一个特殊问题。我希望使用从3个不同的jpa查询中获取结果,并分别处理它们,然后使用将它们写入一个统一的XML文件。 对于eg,生成的XML看起来像是,