在 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:将更新的学生写入输出文件
我是 批处理 领域的新手,我正在尝试使用 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:将更新的学生写入输出文件