Spring Batch-从DB读取-转换-并写入文件

时间:2019-09-12 02:42:01

标签: java spring spring-batch

我正在探索Spring批处理,并且我有一个问题说明,要求我从db中读取,将这些数据转换为逗号分隔的形式并写入文件。我有大约50个不同的查询和要创建的文件数量。这些查询很少返回巨大的数据,这些数据可能会使我的文件变大。我正在用Spring Batch解决此问题,并且总体上很少有关于Spring Batch的查询。

  1. 当我需要转换特定字段值时可以使用字段提取器。

BeanWrapperFieldExtractor<StudentDTO> extractor = new BeanWrapperFieldExtractor<>();
extractor.setNames(new String[] {"name", "emailAddress", "purchasedPackage"});
lineAggregator.setFieldExtractor(extractor);

例如,如果我需要做诸如StudentDto.getName()。replace(“ a”,“”)之类的事情。在这种情况下我应该去定制处理器吗?

  1. 在这种情况下,一项包含50个步骤并并行处理的工作是否合适?
  2. 将标头写入文件顶部而不是使用FlatFileHeaderCallback-下面的写入文件的方法是否可以接受?

@Override
public ExitStatus afterStep(StepExecution stepExecution) {
   if (stepExecution.getStatus() == "COMPLETED") {
   
      fileWriter.write("headerString");
      Path path = Paths.get("encryptedTextFileThreaded.txt");
      try (BufferedWriter fileWriter = Files.newBufferedWriter(path)) {
        for(Line line: studentDtoLines)
        {
          fileWriter.write(line.getLine());
          fileWriter.newLine();
        }
      
      fileWriter.write("footerString");
  }
  catch (Exception e) {
      log.error("Fatal error: error occurred while writing {} file",path.getFileName());
  }
}
    
   

  1. 多线程步骤用于加快单个步骤。如果我有一个包含50个步骤的Job,但它们中的任何一个都不相互依赖,则可以采用并行处理来加快Job的执行速度。真正?这是否意味着Spring Batch可以创建50个线程并在Paralle中运行所有线程?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 当我需要转换特定的字段值时,可以使用字段提取器吗?在这种情况下我应该去定制处理器吗?
  2.   

我将使用处理器进行数据转换。这是项目处理器的典型用例。优良作法是使每个组件做一件事情(并做得很好):使用字段提取器提取字段,并使用项目处理器进行转换。这对于测试和可重用性来说更好。

  
      
  1. 在这种情况下,一项包含50个步骤并并行处理的工作是一种合适的方法吗?
  2.   

出于可重新启动性的考虑,IMO为每个文件提供一个作业是更好的选择。当文件处理失败时,最好(和更干净)地为该特定文件重新启动失败的作业,而不是相同的作业,并跳过49个步骤。您始终可以通过在JobLauncher上使用适当的任务执行程序来并行运行多个作业。

  
      
  1. 将标头写到文件顶部而不是使用FlatFileHeaderCallback-下面的写文件方式可以接受吗?
  2.   

不,这是对监听器的错误使用。我将使用页眉/页脚回调进行页眉/页脚写入,并使用面向块的步骤来写入文件的内容。

  
      
  1. 多线程步骤用于加快单个步骤。如果我有一个包含50个步骤的Job,但它们中的任何一个都不相互依赖,则可以采用并行处理来加快Job的执行速度。真正?这是否意味着Spring Batch可以创建50个线程并在Paralle中运行所有线程?
  2.   

是的。您可以在并行流上设置的TaskExecutor中配置并行度。有关更多详细信息,请参见Parallel steps