步骤链接的说明

Clarification on Step Chaining

因为在Spring Batch中对Step Chaining有很多不同的看法,根据用例,我想知道什么是最常识:

步骤链接,即一个作业有一个步骤流,其中每个步骤都有 Reader、处理器和写入器。使用 Job ExecutionContext 交换步骤之间的数据。

ItemProcessors 链接,即一个作业只有一个步骤,但是 ItemProcessors 流。

我认为第一种可能性比较合理,因为名字'Job'意味着有几个步骤可以完成它。在许多用例中的缺点可能是,在步骤的开始和结束时会有冗余或有时 'empty' 读写。 第二种是最常见的解决方案,但我认为这个 'one step' 解决方案并不完全是批处理的目的。

你对此有何看法?

来自http://docs.spring.io/spring-batch/reference/html/domain.html#domain

A Job has one to many steps, which has exactly one ItemReader, ItemProcessor, and ItemWriter.

所以 Spring 哲学是步骤的链接。

ItemProcessors 的用途非常有限,它们最适用于您想要转换您读入的每个项目的情况。您可以使用它们来过滤掉不需要的行,但在某些情况下(当你的 reader 执行一个 SQL 查询)很快就会变得浪费,如果你可以避免首先阅读这些行,它会更有效率。

很高兴在流程中有一个钩子能够放入 ItemProcessors,但我不会过度使用它。大多数非平凡的工作似乎有多个步骤,框架为错误处理、分块、分区等步骤提供支持,其中 ItemProcessors 与步骤相比非常轻量级,框架不提供任何支持在工作流程中为他们提供一席之地。

(语句 "Data between Steps is exchanged using the Job ExecutionContext" 似乎有问题。我用它来保存读取或写入的行数之类的东西。它不是放置比这大得多的东西的好地方。)

完全同意Nathan和lexicore的回答。

但是有一点我想补充一下。我从不使用 JobExecutionContext 交换业务数据。

如果我编写一个包含多个步骤的作业,那么每个步骤都会将其业务数据写入一个文件,接下来的步骤会从那里读取它。

此外,在我工作的公司中,我们定义了 STEPP 模式,我们几乎所有的批次都遵循该模式。

STEPP 代表

  1. SELECT -> select 数据,例如来自数据库
  2. TRANSFORM / FILTER -> 以更方便的结构进行转换and/or filter
  3. ENRICH -> 如有必要,添加业务逻辑所需的额外数据,如果在 selection 阶段
  4. 未完成,则加载成本更低
  5. 处理 -> 应用业务逻辑
  6. 坚持 -> 坚持

并非每个工作都有所有提到的阶段。例如,它们中的大多数都没有丰富阶段。有些只有 SELECT、TRANSFORM 和 PERSIST 步骤。

通常,不同的阶段作为一个步骤实现,它将数据存储在一个文件中,该文件由后续步骤读取。有时,整个工作只是一个步骤。有时,一个阶段由几个步骤组成。它总是取决于工作的大小。

我们还使用了适当的命名,以便可以清楚地识别不同的阶段。例如,我们的包被命名为 com.xy._1_select、com.xy._2_transform 等。使用包名称中的数字可以直接让它们在您的 IDE 的 project/package 观众。