2014-10-30 65 views
5

在Spring Batch的documentation上,为了配置一个步骤,清晰的图片描述了如何执行读取过程和写入。有关面向块的步骤与现实的Spring批处理文档?

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

通讯(根据DOC):

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 
... 
read 
// until #amountOfReads = commit interval 
process 
... 
process 
// until #amountOfProcesses = commit interval 
write 

那么文档是否错误?还是我错过了一些配置,使其行为像文档(没有发现任何东西)。

我遇到的问题是每个后续读取都取决于处理器的状态。读取器是一个组合,它可以并行读取两个源,具体取决于其中一个源中的读取项目,在一次读取操作期间只读取第一个,第二个或两个源。但是在处理器中读取哪些源的状态。目前唯一的解决方案是提交间隔1,这对于性能来说并不是最优的。

+0

你可以试试它与自定义阅读器,它包装标准的阅读器和你的自定义逻辑 – 2014-10-30 15:37:43

+0

是的我想过,但它不符合一批的模型。读者不负责创建输出。 – Juru 2014-10-31 06:37:19

+0

我会尝试与源数据库表(第一批导入),并阅读数据与适当的SQL(第二批业务处理) – 2014-10-31 11:13:08

回答

3

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

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

对于选项二。是的,在该步骤的执行上下文中有一个状态。这不是使用的处理器的输出。 – Juru 2014-10-31 19:12:33

+0

我如何分享您的工作配置?它并没有真正与这个问题有关。 – Juru 2014-10-31 19:16:50

+0

创建一个新话题,询问如何在Spring Batch中处理处理器和阅读器之间的状态管理。 – 2014-11-02 20:10:36

相关问题