Spring Batch文档关于面向块的步骤与现实的对比? [英] Spring Batch documentation about chunk-oriented step versus reality?

查看:14
本文介绍了Spring Batch文档关于面向块的步骤与现实的对比?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Spring Batch用于配置步骤的documentation上,有一幅清晰的图片描述了读写过程是如何进行的。

read
process
...
read
process
// until #amountOfReadsAndProcesses = commit interval
write

对应(根据单据):

List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
    Object item = itemReader.read()
    Object processedItem = itemProcessor.process(item);
    items.add(processedItem);
}
itemWriter.write(items);

但是,当我调试并在读取器的read方法中放置断点和在处理器的process方法中放置断点时,我看到以下行为:

read
...
read
// until #amountOfReads = commit interval
process
...
process
// until #amountOfProcesses = commit interval
write

那么文档有误吗?或者我缺少使其行为与文档类似的配置(在那里没有找到任何内容)。

我遇到的问题是,现在每个结果读取都取决于处理器的状态。读取器是并行读取两个源的复合体,取决于其中一个源中的读取项,在一次读取操作期间仅读取第一、第二或两个源。但是要读取源的状态是在处理器中做出的。目前唯一的解决方案是使用提交间隔1,这对性能不是非常优化。

推荐答案

简短的答案是,您是正确的,我们的文档在分块模型上不准确。这是需要更新的东西。为什么会是这样是有原因的(它们主要与如何处理容错有关)。但这并没有解决你的问题。对于您的用例,有两个选项:

  • 使用JSR-352配置配置您的作业-JSR-352的处理模型是我们的文档所说的(他们认为它是福音,而不是Spring Batch真正做的事情)。因为Spring Batch支持JSR-352,所以只需更改您的配置和启动作业的方式,您就会得到相同的结果。JSR-352有一些限制,这些限制超出了本讨论的范围,但它是一种选择。
  • 另一种选择是按照Michael Pralow的建议去做-虽然我理解您对关注点分离的担忧,但鉴于您的处理器正在生成读者需要的输出(或者您是否以其他方式共享该状态?),您似乎已经违反了该规则。
  • 其他选项-在不更多地了解您的工作的情况下,可能还有其他方法可以很好地组织您的工作(如将逻辑移动到多个步骤等),并且仍然可以实现Spring Batch试图允许的关注点分离,但是我需要看到更多您的配置才能对此有所帮助。

这篇关于Spring Batch文档关于面向块的步骤与现实的对比?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆