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

Spring批处理创建多个文件。基于Gradle的项目

季凡
2023-03-14

我需要创建3个单独的文件。

我的批处理作业应该从Mongo读取,然后解析信息并找到“业务”列(3种业务类型:retAIL、HPP、SAX),然后为它们各自的业务创建一个文件。该文件应该创建任何一个retAIL formattedDate;HPP formattedDate;SAX formattedDate作为文件名和在txt文件中的DB中找到的信息。此外,我需要将.资源(new FileSystemResources("C:\fileWrit\index.txt))设置为将信息发送到正确位置的东西,现在硬编码可以工作,但只创建一个. txt文件。

示例:

 @Bean
public FlatFileItemWriter<PaymentAudit> writer() {
    LOG.debug("Mongo-writer");      
    FlatFileItemWriter<PaymentAudit> flatFile = new 
    FlatFileItemWriterBuilder<PaymentAudit>()
            .name("flatFileItemWriter")
            .resource(new FileSystemResource("C:\\filewriter\\index.txt)) 
         //trying to create a path instead of hard coding it
            .lineAggregator(createPaymentPortalLineAggregator())
            .build();
    String exportFileHeader = 
   "CREATE_DTTM";
    StringHeaderWriter headerWriter = new 
    StringHeaderWriter(exportFileHeader);
    flatFile.setHeaderCallback(headerWriter);
    return flatFile;

}

我的想法是,但不确定要去哪里:

public Map<String, List<PaymentAudit>> getPaymentPortalRecords() {
List<PaymentAudit> recentlyCreated = 
PaymentPortalRepository.findByCreateDttmBetween(yesterdayMidnight,
        yesterdayEndOfDay);

List<PaymentAudit> retailList = new ArrayList<>();
List<PaymentAudit> saxList = new ArrayList<>();
List<PaymentAudit> hppList = new ArrayList<>();
//String exportFilePath = "C://filewriter/";??????
recentlyCreated.parallelStream().forEach(paymentAudit -> {
    if (paymentAudit.getBusiness().equalsIgnoreCase(RETAIL)) {
        retailList.add(paymentAudit);
    } else if 
(paymentAudit.getBusiness().equalsIgnoreCase(SAX)) {
        saxList.add(paymentAudit);
    } else if 
(paymentAudit.getBusiness().equalsIgnoreCase(HPP)) {
        hppList.add(paymentAudit);
    }
});

共有1个答案

蒯卓君
2023-03-14

要为每个业务对象类型创建文件,可以使用ClassifierCompositeItemWriter。在您的情况下,可以为每种类型创建一个编写器,并将它们作为委托添加到复合项编写器中。

根据动态创建文件名,您需要使用步骤范围的编写器。参考文档的步骤范围部分中有一个示例。

希望这有帮助。

 类似资料:
  • 我们使用Spring Batch进行一些处理,通过Reader读取一些ID,我们希望通过处理器将它们处理为“块”,然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方,不能为每个项目调用服务。 我看到我们可以为“块”中涉及的所有读取器-处理器-写入器创建包装器,以处理列表<>并委托给一些具体的读取器/处理器/写入器。但这对我来说并不是件好事。像这样:

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

  • 我的问题陈述。读取包含1000万数据的csv文件,并将其存储在数据库中。用尽可能少的时间 我使用java的简单多线程执行器实现了它,其逻辑几乎与spring batch的chunk相似。从csv文件中读取预配置数量的数据,然后创建一个线程,并将数据传递给线程,该线程验证数据,然后写入多线程运行的文件。完成所有任务后,我将调用sql loader来加载每个文件。现在我想把这段代码移到spring b

  • 我想分散加工大批量。这个想法是使用Spring Batch在云中激发一堆AMQP消费者,然后加载廉价的任务(如项目ID)并将它们提交给AMQP交换。结果的书写将由消费者自己完成。 null

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

  • 我目前正在编写一个Spring批处理,其中我正在读取一个数据块,并对其进行处理,然后我希望将此数据传递给两个Writer。一个writer将简单地更新数据库,而第二个writer将写入csv文件。 我计划编写自己的自定义编写器,并在customItemWriter中注入这两个ItemWriter,并在customItemWriter的write方法中调用这两个ItemWrite的write方法。这