跳过情况下禁用春批单项处理 [英] Disable Spring Batch single-item processing in skip situation

查看:11
本文介绍了跳过情况下禁用春批单项处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个处理(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆