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

Spring 在春季批次中将一个大步分解为多个步骤,spring,spring-batch,batch-processing,system-design,Spring,Spring Batch,Batch Processing,System Design,我是批处理领域的新手,我正在尝试使用Spring batch解决下面提到的问题。我真的很难在如何创建多步骤批处理作业了 给定 具有多个学生记录的csv文件 学生 受试者1分 受试者2分 受试者3分 结果 1. 59 51 54 悬而未决的 2. 79 20 76 悬而未决的 由于REST endpoint在将学生写入文件之前接受需要分块处理的学生列表,因此您可以使用ItemWriteListener#beforeWrite(list)在其中进行调用。此侦听器是获取项目列表的第一个扩展点。因此,面

我是批处理领域的新手,我正在尝试使用Spring batch解决下面提到的问题。我真的很难在如何创建多步骤批处理作业了

给定

具有多个学生记录的csv文件

学生 受试者1分 受试者2分 受试者3分 结果 1. 59 51 54 悬而未决的 2. 79 20 76 悬而未决的
由于REST endpoint在将学生写入文件之前接受需要分块处理的学生列表,因此您可以使用
ItemWriteListener#beforeWrite(list)
在其中进行调用。此侦听器是获取项目列表的第一个扩展点。因此,面向块的步骤可以设计如下:

  • 项目阅读器:FlatFileItemReader,用于逐个阅读学生
  • 项目处理者:验证学生
  • ItemWriteListener:对当前学生组进行REST调用并更新其状态
  • ItemWriter:将更新的学生写入输出文件

每批进行一次REST调用
:这是否意味着您的REST端点接受一个学生列表而不是一个学生?是@MahmoudBenHassine,REST端点接受一个学生列表。一个文件包含100K条记录。否则,我将最终触发10万个REST调用。另外还有不止一个文件。@MahmoudBenHassine如果我们有两种不同类型的文件,xml和csv会怎么样。现在我有两个不同的ItemReader和ItemWriter,分别用于xml和csv。我将有两个作业,一个用于csv,一个用于xml吗?如果这些是独立任务,您可以在同一个作业中运行两个并行步骤。@MahmoudBenHassine是的,它们是独立任务。我应该做两份工作,一份用于CSV,一份用于XML吗?还是两步并行?@truekiller我相信这回答了你的问题,所以请接受它。否则,让我知道接受它缺少什么。马哈茂德,你能看看另一个春季批次问题吗。我会的。在我看来,这里的答案确实是正确的。在编写之前,应在
ItemWriteListener#中处理块中的项目,因为这是给出要编写项目列表的第一个扩展点(除非您想在writer中进行处理,这不像在侦听器中分离处理那样干净)。如果答案在这里有用,请接受它:。谢谢。这取决于您的要求:如果REST调用将丰富项目内容,并且应该在编写项目之前完成,那么使用侦听器就是一种方法。如果REST调用用于将项目写入数据接收器以及其他位置,则复合写入器也是一个选项。但您的问题意味着REST调用将返回写入csv之前所需的结果(将学生的结果标记为通过/失败):使用复合写入器,相同的项将写入多个数据源。如果您在第一个写入器中内联更改项(即更改对象),事实上,第二位作者将看到这些变化。这可能会起作用,但它不像在与编写器一起编写项目之前使用侦听器来准备项目那样干净。