由于对Spring Batch中的Step Chaining有很多不同的看法,根据用例,我想知道最常见的是什么:
步骤链接,即一个Job有一个步骤流,其中每个步骤都有Reader,Processer&作家。使用Job ExecutionContext交换步骤之间的数据。
OR
ItemProcessors的链接,即作业只有一步而且是一个ItemProcessors流。
在我看来,第一种可能性更合理,因为“Job”这个名称意味着有几个步骤可以完成它。许多使用案例的缺点可能是,多余的或有时是“空”的阅读&在步骤的开始和结束时写作。 第二个是最常见的解决方案,但我认为这个“一步”解决方案并不完全适用于批处理。
您对此有何看法?
答案 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代表
并非所有工作都提到了所有阶段。例如,他们中的大多数人没有富裕阶段。有些只是SELECT,TRANSFORM和PERSIST步骤。
通常,不同阶段实现为一步,将数据存储在由后续步骤读取的文件中。有时,整个工作只是一步。有时,阶段包括几个步骤。它总是取决于工作的大小。
我们还使用适当的命名,以便可以清楚地识别不同的阶段。例如,我们的软件包名为com.xy._1_select,com.xy._2_transform等。使用软件包名称中的数字可以直接在IDE的项目/软件包查看器中输入正确的顺序。