gpt4 book ai didi

spring-batch - 在跳过情况下禁用 Spring Batch 单项处理

转载 作者:行者123 更新时间:2023-12-05 06:34:04 24 4
gpt4 key购买 nike

我有一份工作以 block (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();

如果一个 block 失败,批量重试该 block ,但一次重试一个项目(为了找出哪个项目导致失败)但在我的情况下没有一个项目导致失败,情况是整个 block 成功或失败作为一个 block ,应该作为一个 block 重试(实际上,下降到单项模式导致远程服务非常生气,它拒绝接受数据。我们不控制远程服务)。

摆脱困境的最佳方法是什么?我试图看看我是否可以禁用单项重试模式,但我什至不完全理解这种情况发生在哪里。是否有自定义 SkipPolicy 或我可以实现的东西? (那里的方法看起来没那么有用)

或者有什么方法可以让项目读取器读取 1000 条记录,但将其作为 List(1000 个输入项 => 一个输出项)传递给编写器?

最佳答案

让我分两部分来看这个。首先,我将解释其工作方式的原因,然后我将提出解决您的问题的选项。

为什么是逐条重试

在您的配置中,您已指定它是容错的。这样,当 ItemWriter 中抛出异常时,我们不知道是哪个项目导致的,所以我们没有办法跳过/重试它。这就是为什么当我们开始跳过/重试逻辑时,我们会逐项进行。

如何按 block 处理重试

归根结底,您需要将 block 大小设置为 1 才能使其正常工作。这意味着不依赖 Spring Batch 来迭代 ItemProcessor 的 block 中的项目。 ,你必须自己做。所以你的 ItemReader会返回 List<DataRecord>和你的 ItemProcessor将遍历该列表。你的ItemWriter需要 List<List<DataRecord>> .我建议为 ItemWriter 创建一个装饰器在将外部列表传递给主列表之前打开外部列表 ItemWriter .

这确实消除了真正跳过该列表中单个项目的能力,但听起来这对您的用例来说没问题。

关于spring-batch - 在跳过情况下禁用 Spring Batch 单项处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50438320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com