跳过情况下禁用春批单项处理 [英] Disable Spring Batch single-item processing in skip situation
本文介绍了跳过情况下禁用春批单项处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个处理(1000个)块中的项目的作业。这些项被编组到单个JSON有效负载中,并作为批处理发送到远程服务(在一个HTTP POST中全部为1000个)。有时,远程服务陷入停顿,连接超时。我为此设置了跳过
return steps.get("sendData")
.<DataRecord, DataRecord> chunk(1000)
.reader(reader())
.processor(processor())
.writer(writer())
.faultTolerant()
.skipLimit(10)
.skip(IOException.class)
.build();
如果区块失败,Batch会一次重试该区块,但每次只重试一个项目(以找出导致失败的是哪个项目),但在我的例子中,没有一个项目导致失败,情况是整个区块作为一个区块成功或失败,应该作为一个区块重试(实际上,拖入单项目模式会导致远程服务非常生气并拒绝接受数据)。我们不控制远程服务)。
我最好的解决办法是什么?我试着看看我是否可以禁用单项重试模式,但我甚至不完全理解在哪里会发生这种情况。是否有自定义SkipPolicy
或我可以实现的东西?(那里的方法看起来没什么用处)
或者有什么方法可以让项目阅读器读取1000条记录,然后将其作为List
(1000个输入项=>一个输出项)传递给编写器?
推荐答案
让我分两部分介绍。首先,我将解释它的工作原理,然后我将提出解决您的问题的选项。
为什么要逐项重试
在您的配置中,您已经指定它是容错的。这样,当ItemWriter
中抛出异常时,我们不知道是哪一项导致的,因此我们无法跳过/重试它。这就是为什么,当我们开始跳过/重试逻辑时,我们会逐项进行。
如何按块处理重试
这归根结底是您需要将块大小设置为1才能正常工作。这意味着,您不必依赖Spring Batch来迭代ItemProcessor
块中的项,而是必须自己来做。因此您ItemReader
将返回List<DataRecord>
,ItemProcessor
将遍历该列表。您的ItemWriter
将需要List<List<DataRecord>>
。我建议为ItemWriter
创建一个修饰符,在将外部列表传递给主ItemWriter
之前将其展开。
这确实消除了真正跳过该列表中的单个项目的功能,但听起来这对于您的用例来说是可以的。
这篇关于跳过情况下禁用春批单项处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文