Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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,表中总共有8条记录,其中6条在spring批处理调用读取时符合jpareader的条件。现在我将页面大小和块大小设置为1进行测试。期望当作业运行时,它应该进行6次读取调用,然后它应该逐个处理并逐个写入。但实际上,它只调用read 4次(从日志中我可以看到读取页面0…1,类似于这样),然后处理4次,其中一次被过滤掉,因为不符合写入条件,然后它只更新3条记录,并将作业标记为已成功完成 例如,为了处理所有记录,此作业需要运行3次。有些事情我们不清楚。试图理解区块处理,但我认为区块只是聚合结果以进行写调

表中总共有8条记录,其中6条在spring批处理调用读取时符合jpareader的条件。现在我将页面大小和块大小设置为1进行测试。期望当作业运行时,它应该进行6次读取调用,然后它应该逐个处理并逐个写入。但实际上,它只调用read 4次(从日志中我可以看到读取页面0…1,类似于这样),然后处理4次,其中一次被过滤掉,因为不符合写入条件,然后它只更新3条记录,并将作业标记为已成功完成

例如,为了处理所有记录,此作业需要运行3次。有些事情我们不清楚。试图理解区块处理,但我认为区块只是聚合结果以进行写调用。之后,我希望读取和处理应该继续


在这个测试中,我们对为生产设置块大小感到困惑,如果我们设置为大数字,它将需要更多的内存(堆)。

我看到了困惑。
JpaPagingItemReader
pageSize
参数与面向块的步骤的
chunkSize
(或
commit interval
)无关

如果您使用
JpaPagingItemReader
并在pageSize=4的面向块的步骤之外使用它,它将一次获取4个项目(即,每页)。例如,现在这4个项目可以分为2个块进行处理,每页将有两个块。
JpaPagingItemReader
将读取第一页(由4项组成的列表),然后每次通过面向块的步骤调用
read
,都会从该列表返回项。下面是一个具有
pageSize=4
chunkSize=2
totalItems=8
和区块侦听器的示例:

ChunkListener.beforeChunk
Reading page 0
Reading item1
Reading item2
Writing item1
Writing item2
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading item3
Reading item4
Writing item3
Writing item4
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading page 1
Reading item5
Reading item6
Writing item5
Writing item6
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading item7
Reading item8
Writing item7
Writing item8
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading page 2
Reading item = null
ChunkListener.afterChunk
我用这个配置创建了一个应用程序,这样您就可以使用它并查看它是如何工作的


希望这有助于理解与分页项读取器一起使用时面向块的处理模型。

我看到了混淆。
JpaPagingItemReader
pageSize
参数与面向块的步骤的
chunkSize
(或
commit interval
)无关

如果您使用
JpaPagingItemReader
并在pageSize=4的面向块的步骤之外使用它,它将一次获取4个项目(即,每页)。例如,现在这4个项目可以分为2个块进行处理,每页将有两个块。
JpaPagingItemReader
将读取第一页(由4项组成的列表),然后每次通过面向块的步骤调用
read
,都会从该列表返回项。下面是一个具有
pageSize=4
chunkSize=2
totalItems=8
和区块侦听器的示例:

ChunkListener.beforeChunk
Reading page 0
Reading item1
Reading item2
Writing item1
Writing item2
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading item3
Reading item4
Writing item3
Writing item4
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading page 1
Reading item5
Reading item6
Writing item5
Writing item6
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading item7
Reading item8
Writing item7
Writing item8
ChunkListener.afterChunk
ChunkListener.beforeChunk
Reading page 2
Reading item = null
ChunkListener.afterChunk
我用这个配置创建了一个应用程序,这样您就可以使用它并查看它是如何工作的


希望这有助于理解与分页项目读取器一起使用时面向块的处理模型。

页面大小是什么意思?你能发布你的配置的相关部分吗?你所说的页面大小是什么意思?你能发布你的配置的相关部分吗?哇,我以前没见过这个。现在我将使用您的示例应用程序。但不管这是为什么在我的例子中,它没有在一次作业运行中处理所有项目(有许多读取和块)。谢谢。我可以用你们的样品重现我的问题。我又添加了一条名为Tom的记录(从数据开始,就是第一条记录)。我将查询改为“fromcustomewherefirstname='Tom',”并添加了ItemProcessor,其中我将firstName设置为大写。现在将页面大小和块大小更改为1。若我运行应用程序,它只处理第一条记录,作业就完成了,而第二条Tom并没有转换成大写。我希望一个接一个地处理这两个Tom。在开始时向数据集添加了一条记录“Tom Cruise”+更新了查询/处理器,仍按预期工作:
MyJob.BeforeCunk阅读第0页阅读customer=customer[id=1,firstName='Tom',lastName='Cruise']写入customer=customer[id=1,firstName='Tom',lastName='Cruise']MyJob.afterChunk MyJob.BeforeCunk阅读第1页阅读customer=customer[id=8,firstName='Tom',lastName='Hanks']写作customer=customer[id=8,firstName='Tom',lastName='Hanks']MyJob.afterChunk MyJob.BeforeCunk阅读第2页阅读customer=null MyJob.afterChunk
我只能看到这些主要更改,如果这样做的话,我将创建要提交的repo分支。@组件公共类MyItemProcessor实现ItemProcessor{@Override public Customer process(Customer Customer)抛出异常{Customer.setFirstName(Customer.getFirstName().toUpperCase());return Customer;}}和return steps.get(“step”).chunk(chunk_SIZE).reader(itemReader(null)).processor(myItemProcessor).writer(itemWriter()).listener(chunkListener()).build();另外,区块和页面大小设置为1Wow,我以前从未见过这种情况。现在我将使用您的示例应用程序。但不管这是为什么在我的例子中,它没有在一次作业运行中处理所有项目(有许多读取和块)。谢谢。我可以用你们的样品重现我的问题。我又添加了一条名为Tom的记录(从数据开始,就是第一条记录)。我将查询改为“fromcustomewherefirstname='Tom',”并添加了ItemProcessor,其中我将firstName设置为大写。现在将页面大小和块大小更改为1。若我运行应用程序,它只处理第一条记录,作业就完成了,而第二条Tom并没有转换成大写。我希望一个接一个地处理这两个Tom。在开始时向数据集添加了一条记录“Tom Cruise”+更新了查询/处理器,仍按预期工作:
MyJob.BeforeCunk阅读页面0阅读customer=customer[id=1,firstName='Tom',lastName='Cruise']写入customer=customer[id=1,firstName='Tom',lastName']