关于步骤链的澄清

时间:2016-11-21 14:55:56

标签: java spring spring-batch batch-processing

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

步骤链接,即一个Job有一个步骤流,其中每个步骤都有Reader,Processer&作家。使用Job ExecutionContext交换步骤之间的数据。

OR

ItemProcessors的链接,即作业只有一步而且是一个ItemProcessors流。

在我看来,第一种可能性更合理,因为“Job”这个名称意味着有几个步骤可以完成它。许多使用案例的缺点可能是,多余的或有时是“空”的阅读&在步骤的开始和结束时写作。 第二个是最常见的解决方案,但我认为这个“一步”解决方案并不完全适用于批处理。

您对此有何看法?

3 个答案:

答案 0 :(得分:1)

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

  

Job有一个到多个步骤,其中只有一个ItemReader,ItemProcessor和ItemWriter。

所以春天的哲学是步骤的链接。

答案 1 :(得分:1)

ItemProcessors的用处非常有限,它们最适合您想要转换所读取的每个项目的情况。您可以使用它们来过滤掉您不想要的行,但在某些情况下(当您的读者时)执行一个快速浪费的SQL查询),如果你可以避免必须首先读取这些行,它会更有效率。

在进程中有一个钩子可以放入ItemProcessors很好,但我不会过度使用它。大多数非平凡的工作似乎都有多个步骤,并且框架为错误处理,分块,分区等步骤提供支持,其中ItemProcessors与步骤相比非常轻量级,并且框架不提供任何支持在工作流程中为他们提供场所。

(“使用Job ExecutionContext交换步骤之间的数据”这句话似乎有问题。我用它来保存读取或写入行数的计数。这不是放置任何大于这一点。)

答案 2 :(得分:1)

我完全赞同内森和词典给出的答案。

但有一句话,我想补充一下。我从不使用JobExecutionContext交换businessdata。

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

此外,在我与之合作的公司中,我们已经定义了几乎所有批次都遵循的STEPP模式。

STEPP代表

  1. SELECT - >选择数据,例如来自数据库
  2. TRANSFORM / FILTER - >转换为更方便的结构和/或过滤
  3. ENRICH - >如果必要的话,添加业务逻辑所需的额外数据,如果在选择阶段没有完成,则加载更便宜
  4. PROCESS - >应用businesslogic
  5. PERSIST - >坚持
  6. 并非所有工作都提到了所有阶段。例如,他们中的大多数人没有富裕阶段。有些只是SELECT,TRANSFORM和PERSIST步骤。

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

    我们还使用适当的命名,以便可以清楚地识别不同的阶段。例如,我们的软件包名为com.xy._1_select,com.xy._2_transform等。使用软件包名称中的数字可以直接在IDE的项目/软件包查看器中输入正确的顺序。