Spring批处理的默认行为是仅在第一个项目完成后才处理下一个项目吗?

时间:2018-12-17 14:54:46

标签: spring spring-batch

在读过this article关于Spring-Batch中扩展和并行处理的可能性之后,我们想知道,Spring批处理的开箱即用行为是什么?

假设我们的工作有读者,5个步骤和一名作家。

Spring-batch会读取一项,然后通过所有5个步骤,将其写入,然后再转到下一项吗?像巨型for loop一样?

还是有些并行性,所以当将项目A移至步骤2时,将项目B读取并处理至步骤1?

1 个答案:

答案 0 :(得分:0)

我认为您误解了Spring Batch的工作原理。首先,让我进入并行性。

Spring Batch中基于块的步骤包括一个ItemReader,一个可选的ItemProcessor和一个ItemWriter。这些显然都支持合成(Spring Batch提供了一些在ItemProcessorItemWriter阶段都使用合成的组件)。在该步骤中,Spring Batch读取项目,直到满足给定条件(通常为块大小)为止。然后遍历该列表,将每个项目传递到ItemProcessor。最后,来自ItemProcessor调用的所有结果的列表在单个调用中传递给ItemWriter。阅读一次,然后执行多个步骤,然后编写的概念实际上并不是Spring Batch的工作原理。我们得到的最接近的是单个ItemReader,然后使用组合创建一个ItemProcessor调用链,然后是对ItemWriter的单个调用。

话虽如此,Spring Batch提供了许多并行性选项。有五个不同的选项可用于扩展Spring Batch作业。我不会详细介绍每个细节,因为这超出了本文的范围,并且在其他StackOverflow问题和文档中都进行了明确讨论。但是,列表如下:

  1. 多线程步骤-这里,每个块(在事务中处理的项目块)都是使用Spring的TaskExecutor抽象在不同的​​线程中执行的。
  2. 并行步骤-在这里,批处理作业使用Spring的TaskExecutor抽象来再次并行控制多个独立步骤,以控制使用的thead。
  3. AsyncItemProcessor / AsyncItemWriter-在这里,对ItemProcessor的每次调用都在其自己的线程中被调用。结果Future被传递到AsyncItemWriter,后者解开Future并保持结果。
  4. 分区- Spring Batch允许您将数据集划分为多个分区,然后通过本地线程机制或远程并行执行。
  5. 远程分块-最后一个选择是让主服务器读取数据,然后将其发送到工作池中进行处理和写入。