Spring batch 在跳过情况下禁用Spring批处理单个项目

Spring 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

我有一份工作,可以成批(1000个)处理项目。这些项被编组到一个JSON有效负载中,并作为一个批处理(所有1000项都在一个HTTP POST中)发布到远程服务。有时,远程服务陷入停滞,连接超时。我为此设置了skip

    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中构建一个捕获并重试。