Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于阶梯链的澄清_Java_Spring_Spring Batch_Batch Processing - Fatal编程技术网

Java 关于阶梯链的澄清

Java 关于阶梯链的澄清,java,spring,spring-batch,batch-processing,Java,Spring,Spring Batch,Batch Processing,由于对Spring Batch中的步骤链接有许多不同的看法,根据用例的不同,我想知道最常见的常识是什么: 步骤链接,即作业有一个步骤流,其中每个步骤都有读卡器、处理器和写入器。步骤之间的数据使用Job ExecutionContext进行交换 或 项目处理器链接,即作业只有一个步骤,但有一个项目处理器流 在我看来,第一种可能性更合理,因为“工作”这个名字意味着有几个步骤可以完成它。许多用例的缺点可能是,在一个步骤的开始和结束时会有冗余的或有时是“空的”读写。 第二种是最常见的解决方案,但我认为这

由于对Spring Batch中的步骤链接有许多不同的看法,根据用例的不同,我想知道最常见的常识是什么:

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

项目处理器链接,即作业只有一个步骤,但有一个项目处理器流

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

你对此有何看法?

来自:

作业有一对多个步骤,其中正好有一个ItemReader、ItemProcessor和ItemWriter


因此,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将当前位置存储在执行上下文中(这是执行上下文的用途:流程数据而不是业务数据)。