关于面向块的步骤与现实的Spring Batch文档?

Jur*_*uru 5 spring-batch

在用于配置步骤的Spring Batch 文档中,清晰的图片描述了如何执行读取过程和写入.

read
process
...
read
process
// until #amountOfReadsAndProcesses = commit interval
write
Run Code Online (Sandbox Code Playgroud)

对应(根据文件):

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);
Run Code Online (Sandbox Code Playgroud)

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

read
...
read
// until #amountOfReads = commit interval
process
...
process
// until #amountOfProcesses = commit interval
write
Run Code Online (Sandbox Code Playgroud)

那么文档错了吗?或者我错过了一些配置,使其行为像文档(没有找到任何东西).

我遇到的问题是每个后续读取现在取决于处理器的状态.读取器是并行读取两个源的复合,取决于其中一个源中的读取项,在一次读取操作期间仅读取第一个,第二个或两个源.但是要在处理器中进行读取的源的状态.目前唯一的解决方案是使用commit-interval 1,这对于性能来说不是最佳的.

Mic*_*lla 3

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

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