Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Spring batch Spring批处理文档关于面向块的步骤与现实?_Spring Batch - Fatal编程技术网

Spring batch Spring批处理文档关于面向块的步骤与现实?

Spring batch Spring批处理文档关于面向块的步骤与现实?,spring-batch,Spring Batch,在配置步骤的Spring批上,清晰的图片描述了如何执行读取过程和写入 read process ... read process // until #amountOfReadsAndProcesses = commit interval write 对应(根据单据): 那么文档是否有误?或者我缺少一些配置,使其行为与文档类似(在那里没有找到任何内容) 我遇到的问题是,每个consequetive读取现在都取决于处理器的状态。读取器是并行读取两个源的组合,这取决于一个源中的读取项,在一次读取操作

在配置步骤的Spring批上,清晰的图片描述了如何执行读取过程和写入

read
process
...
read
process
// until #amountOfReadsAndProcesses = commit interval
write
对应(根据单据):

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


我遇到的问题是,每个consequetive读取现在都取决于处理器的状态。读取器是并行读取两个源的组合,这取决于一个源中的读取项,在一次读取操作期间仅读取第一个、第二个或两个源。但要读取的源的状态是在处理器中生成的。目前唯一的解决方案是提交间隔1,这对性能来说不是很理想。

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

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

你可以用一个定制阅读器来尝试,它包装了标准阅读器和你的定制逻辑。是的,我考虑过,但它不符合批量生产的模式。读取器不负责创建输出。我会尝试使用源的数据库表(第一批导入),并使用正确的SQL(第二批用于业务处理)读取选项二的数据。是,步骤的执行上下文中存在状态。使用的不是处理器的输出。我如何与您共享我的作业配置?创建一个新主题,询问如何在Spring批处理中解决处理器和读取器之间的状态管理。
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