Spring batch 在跳过情况下禁用Spring批处理单个项目
我有一份工作,可以成批(1000个)处理项目。这些项被编组到一个JSON有效负载中,并作为一个批处理(所有1000项都在一个HTTP POST中)发布到远程服务。有时,远程服务陷入停滞,连接超时。我为此设置了skipSpring batch 在跳过情况下禁用Spring批处理单个项目,spring-batch,spring-retry,Spring Batch,Spring Retry,我有一份工作,可以成批(1000个)处理项目。这些项被编组到一个JSON有效负载中,并作为一个批处理(所有1000项都在一个HTTP POST中)发布到远程服务。有时,远程服务陷入停滞,连接超时。我为此设置了skip return steps.get("sendData") .<DataRecord, DataRecord> chunk(1000) .reader(reader()) .processor
return steps.get("sendData")
.<DataRecord, DataRecord> chunk(1000)
.reader(reader())
.processor(processor())
.writer(writer())
.faultTolerant()
.skipLimit(10)
.skip(IOException.class)
.build();
return steps.get(“sendData”)
. 区块(1000)
.reader(reader())
.processor(处理器())
.writer(writer())
.容错()
斯基普利米特先生(10)
.skip(IOException.class)
.build();
如果一个块失败,批处理会重试该块,但每次重试一个项目(以找出是哪个项目导致失败),但在我的情况下,没有一个项目导致失败,整个块作为块成功或失败,应该作为块重试(事实上,下降到单项模式会导致远程服务非常生气,并且拒绝接受数据。我们不控制远程服务)
我最好的解决方法是什么?我试图看看是否可以禁用单项重试模式,但我甚至不完全理解这种情况发生的原因。是否有自定义的SkipPolicy
或我可以实现的东西?(那里的方法看起来没有多大帮助)
或者是否有某种方法让条目读取器读取1000条记录,但将其作为
列表传递给写入器(1000个输入条目=>一个输出条目)?让我分两部分来讨论一下。首先,我将解释为什么它是这样工作的,然后我将提出一个选项来解决您的问题
为什么要逐项重试
在您的配置中,您已指定它是容错的。因此,当在ItemWriter
中引发异常时,我们不知道是哪个项目导致了该异常,因此我们无法跳过/重试它。这就是为什么,当我们开始跳过/重试逻辑时,我们会逐项进行
如何按区块处理重试
归根结底,您需要将块大小设置为1才能正常工作。这意味着,您必须自己执行ItemProcessor
,而不是依赖Spring Batch在块内迭代ItemProcessor
,因此您的ItemReader
将返回一个列表和站点MPProcessor
将循环该列表。您的ItemWriter
将获取一个列表
。我建议为ItemWriter
创建一个装饰程序,在将外部列表传递到主ItemWriter
之前将其打开
这确实消除了对列表中单个项目进行真正跳过的能力,但对于您的用例来说,这似乎没什么问题。您的意思是项目阅读器将返回一个只有1个项目的列表,而项目处理器将在发出列表之前对其进行批处理,直到得到1000个项目为止。
我最后做的是关闭所有Spring批处理容错,并在我的自定义ItemWriter中构建一个捕获并重试。