使用Spring Batch汇总数据

时间:2018-06-27 20:56:15

标签: java spring spring-batch

我需要一个计划的过程,该过程报告大表中的摘要。代码运行时,它将在表上生成当前活动的复杂摘要。我公司完全致力于将Spring Batch用于需要计划的任何事情,因此已指示我使用Spring Batch。因此,在尝试设计解决方案时,我正在学习Spring Batch。

在阅读有关Spring Batch的文档时,我发现文档直言不讳地说该文档旨在读取记录,处理该记录然后写入该记录。我找不到使模块能够读取所有数据并生成报告的任何内容。而且我找不到任何允许开发人员执行此操作的示例或教程。我已经能够编写一个项目处理器,以所需的方式将数据存储在类变量中。 (尽管我不热衷于类变量!)但是我看不到一种方法,一旦处理完所有数据,就可以调用处理器的单独方法来生成报告。看来我可以将数据保存在作业上下文中,但是我看不到一种方法来告诉它在处理所有数据并获取我需要生成的报告时运行“ X类”。这似乎是一种非常愚蠢的编程方式,只是使其适合于并非为此目的而设计。

Spring Batch有这种能力吗?如果可以,该如何配置?

1 个答案:

答案 0 :(得分:1)

在您的情况下,我认为最合适的方法是使用Tasklet,而不是面向块的方法。

  

Spring Batch - Reference Documentation, 5.2. TaskletStep所述:

     

面向块的处理不是单步处理的唯一方法。   如果步骤必须包含一个简单的存储过程调用怎么办?您   可以将调用实现为ItemReader并在   程序完成,但这有点不自然,因为这需要   成为无操作ItemWriter。 Spring Batch提供了TaskletStep用于   这种情况。

因此,您可以实现 Tasklet 接口,并将创建报告的所有逻辑放在 execute 方法中。

@Configuration
@EnableBatchProcessing
public class TaskletsConfig {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Bean
    protected Step createReport() {
        return steps
          .get("createReport")
          .tasklet(reportTasklet())
          .build();
    }

    @Bean
    public Job job() {
        return jobs
          .get("createReportJob")
          .start(createReport())
          .build();
    }

    @Bean
    public ReportTasklet reportTasklet(){
        return new ReportTasklet();
    }

    // ...

}  

public class ReportTasklet implements Tasklet {

    @Override
    public RepeatStatus execute(StepContribution stepContribution, 
                                ChunkContext chunkContext) throws Exception {

      // here read all the data and generate a report
      return RepeatStatus.FINISHED;
    }
}

当然,如果适合您,可以将Task拆分为几个Tasklet步骤。

例如:

  • 第一步-检索所有数据;
  • 第二步-生成报告;
  • 第三步-保存报告;

您可以在this article中看到更多有关Tasklet方法和面向块方法之间的区别的示例和详细信息。