在 Spring 批次中将一大步分解为多个步骤

Break down one big step into multiple steps in Spring Batch

我是 批处理 领域的新手,我正在尝试使用 Spring 批处理 来解决下面提到的问题.我真的很苦恼如何从中创建多步批处理作业。

Given

包含多个学生记录的 csv 文件

studentId subject1_score subject2_score subject3_score result
1 59 51 54 PENDING
2 79 20 76 PENDING

我们有一个 REST 端点,它记录学生所有科目的分数和每个学生的 return 结果 (pass/fail)。 Pass/fail 逻辑在给定的 rest 端点中定义。

TODO

从该 csv 中读取一批记录,每批进行一次 REST 调用,根据每个学生在所有三个科目中的分数更新结果。 更新每个学生的结果并为所有记录生成输出 csv。

Class StudentMarksheet {
    String studentId;
    Integer subject1_score;
    Integer subject2_score;
    Integer subject3_score;
    String result;

    ...
}

Class GenerateResultRequestResponseDto {
    Long batchId
    List<StudentMarksheet> students;
    
    ...
}
studentId subject1_score subject2_score subject3_score result
1 59 51 54 PASS
2 79 20 76 FAIL

Update on Requirement

我们可以接收 csv 或 xml 文件。根据文件类型,我们有两种不同的 reader 和写入器(一种用于读取和写入 csv 文件,另一种用于 xml 文件类型)。

My Design solution

读取单个记录并从中创建一个 StudentMarksheet 对象 -> 处理器决定我们在何处拥有有效记录 -> 编写器准备 GenerateResultRequestResponseDto,对 1 批记录执行其余调用并将其写入 csv 文件。

这里的大问题是我是否要做两份工作,一份用于 CSV,另一份用于 XML?

由于您的 REST 端点接受您需要在将它们写入文件之前分块处理的学生列表,因此您可以使用 ItemWriteListener#beforeWrite(List) 并在其中进行调用。此侦听器是获取项目列表的第一个扩展点。所以你的面向块的步骤可以设计如下:

  • Item reader: FlatFileItemReader 给学生一个一个朗读
  • 项目处理器:验证学生
  • ItemWriteListener:对当前学生群进行 REST 调用并更新他们的状态
  • ItemWriter:将更新的学生写入输出文件