首页 文章

关于步骤链的澄清

提问于
浏览
1

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

Chaining of Steps ,即一个Job有一个步骤流,其中每个步骤都有Reader,Processer&Writer . 使用Job ExecutionContext交换步骤之间的数据 .

要么

Chaining of ItemProcessors ,即作业只有一步而且是一个ItemProcessors流 .

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

你对此有何看法?

3 回答

  • 1

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

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

    (“使用Job ExecutionContext交换步骤之间的数据”这句话似乎有问题 . 我用它来保存读取或写入行数的计数 . 这不是放置比这大得多的东西的好地方 . )

  • 1

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

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

    所以 Spring 天的哲学是步骤的链接 .

  • 1

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

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

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

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

    STEPP代表

    • SELECT - >选择数据,例如来自数据库

    • TRANSFORM / FILTER - >转换为更方便的结构和/或过滤器

    • ENRICH - >如果有必要添加业务逻辑所需的额外数据,如果在选择阶段没有完成则加载更便宜

    • PROCESS - >应用businesslogic

    • PERSIST - >坚持

    并非每项工作都提到了所有阶段 . 例如,他们中的大多数没有富集阶段 . 有些只是SELECT,TRANSFORM和PERSIST步骤 .

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

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

相关问题