Java 关于阶梯链的澄清
由于对Spring Batch中的步骤链接有许多不同的看法,根据用例的不同,我想知道最常见的常识是什么: 步骤链接,即作业有一个步骤流,其中每个步骤都有读卡器、处理器和写入器。步骤之间的数据使用Job ExecutionContext进行交换 或 项目处理器链接,即作业只有一个步骤,但有一个项目处理器流 在我看来,第一种可能性更合理,因为“工作”这个名字意味着有几个步骤可以完成它。许多用例的缺点可能是,在一个步骤的开始和结束时会有冗余的或有时是“空的”读写。 第二种是最常见的解决方案,但我认为这种“一步”解决方案并不是批处理的目的 你对此有何看法?来自: 作业有一对多个步骤,其中正好有一个ItemReader、ItemProcessor和ItemWriterJava 关于阶梯链的澄清,java,spring,spring-batch,batch-processing,Java,Spring,Spring Batch,Batch Processing,由于对Spring Batch中的步骤链接有许多不同的看法,根据用例的不同,我想知道最常见的常识是什么: 步骤链接,即作业有一个步骤流,其中每个步骤都有读卡器、处理器和写入器。步骤之间的数据使用Job ExecutionContext进行交换 或 项目处理器链接,即作业只有一个步骤,但有一个项目处理器流 在我看来,第一种可能性更合理,因为“工作”这个名字意味着有几个步骤可以完成它。许多用例的缺点可能是,在一个步骤的开始和结束时会有冗余的或有时是“空的”读写。 第二种是最常见的解决方案,但我认为这
因此,Spring的理念是步骤链接。ItemProcessor的实用性非常有限,它们最适合于您想要转换阅读的每个项目的情况。您可以使用它们过滤掉不需要的行,但在某些情况下(当您的阅读器执行SQL查询时),这会很快变得浪费,如果您可以避免首先读取这些行,那么效率会更高 在这个过程中有一个钩子可以插入ItemProcessors,这很好,但我不会过度使用它。大多数非平凡的作业似乎都有多个步骤,框架提供了对错误处理、分块、分区等步骤的支持,其中ItemProcessor与步骤相比非常轻量级,框架除了在工作流中为它们提供位置之外,没有为它们提供任何支持
(语句“步骤之间的数据是使用作业执行上下文交换的”似乎有问题。我用它来保存诸如读取或写入的行数的计数。这不是一个放置比这大得多的东西的好地方。)我完全同意Nathan和lexicore给出的答案 但我想补充一点。我从不使用JobExecutionContext交换业务数据 如果我编写一个包含多个步骤的作业,那么每个步骤都会将其业务数据写入一个文件,接下来的步骤会从该文件中读取 此外,在我工作的公司中,我们定义了STEPP模式,几乎所有批次都遵循该模式 STEPP代表
我们还使用适当的命名,以便清楚地识别不同的阶段。例如,我们的包名为com.xy.\u 1\u select、com.xy.\u 2\u transform等。使用包名中的数字可以在IDE的项目/包查看器中直接获得正确的顺序。但是不使用ExecutionContext而改为写入文件的原因是什么?想象一下必须处理1000亿行数据。。这样会毁掉你的记忆。使用基于块的方法,无论要处理的行数是多少,您都将有一个恒定的内存使用率。另一件事是故障处理和可重启性。例如,如果您的作业在完成90%的工作后失败,SpringBatch会注意在第二次启动时只处理丢失的10%,因为SpringBatch将当前位置存储在执行上下文中(这是执行上下文的用途:流程数据而不是业务数据)。