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

时间:2014-10-30 14:10:53

标签: 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

文档错了吗?或者我错过了一些配置,使其表现得像文档(没有在那里找到任何东西)。

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

1 个答案:

答案 0 :(得分:3)

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

  • 使用JSR-352配置配置您的作业 - JSR-352的处理模型就是我们的文档所说的(他们把它当作福音而不是Spring Batch真正做的)。由于Spring Batch支持JSR-352,只需更改配置以及如何启动作业,您就可以获得相同的结果。 JSR-352的局限性超出了本次讨论的范围,但它只是一种选择。
  • 另一个选择是做Michael Pralow建议的事情 - 虽然我理解你对关注点分离的担忧,但听起来你已经打破了规则,因为你的处理器正在产生读者需要的输出(或者你是以其他方式分享那个州吗?)。
  • 其他选项 - 如果不了解您的工作,可能还有其他方法可以使您的工作结构良好(将逻辑转换为多个步骤等),并且仍然可以实现Spring Batch尝试允许的关注点分离但是我需要看到更多的配置才能提供帮助。