Spring Batch Chunk处理遇异常陷入无限循环问题咨询
Spring Batch读阶段遇IO异常陷入无限循环的原因与解决办法
问题原因
你遇到的无限循环核心原因是未配置跳过/处理读阶段的IO类异常:
- 你的步骤仅配置了跳过
FlatFileParseException,但读文件时触发的IOException被Spring Batch包装成NonTransientFlatFileException,最终抛出NonSkippableReadException——这类异常默认属于不可跳过、会无限重试的范畴。 - 因为读操作失败时,
FlatFileItemReader的读取位置没有前进(从日志里的FlatFileItemReader.read.count=0就能看出来),所以每次重试都会卡在同一个读取点,导致Chunk反复启动又失败,无限循环。
解决办法
针对这类不可恢复的IO异常,有几种处理方式,根据你的业务需求选择:
1. 跳过IO类异常(需评估业务合理性)
如果业务允许跳过这类读失败的场景,把对应的异常加入跳过列表:
.faultTolerant() .skip(FlatFileParseException.class) .skip(NonTransientFlatFileException.class) // 加入该异常类 .skip(IOException.class) // 或者直接跳过IOException .skipLimit(Integer.MAX_VALUE)
注意:这类异常通常是文件本身的问题(比如句柄失效、文件损坏),跳过之后可能后续读操作依然失败,所以需要结合监控告警。
2. 设置重试上限,避免无限循环
如果希望重试几次后直接失败,而不是无限循环,配置重试次数:
.faultTolerant() .skip(FlatFileParseException.class) .skipLimit(Integer.MAX_VALUE) .retry(IOException.class) .retryLimit(3) // 重试3次后终止任务
这样当重试达到上限时,任务会直接终止,不会无限循环。
3. 标记异常为不可重试,直接终止步骤
对于明确不可恢复的异常(比如文件句柄失效),可以配置不重试,直接让步骤失败:
.faultTolerant() .skip(FlatFileParseException.class) .skipLimit(Integer.MAX_VALUE) .noRetry(NonTransientFlatFileException.class) // 遇到该异常不重试,直接失败
这种方式适合一旦出现这类异常就没有继续执行意义的场景。
额外说明
你的CustomChunkListener里的chunkCount是实例变量,每次Chunk重启都会自增,所以会出现百万级的计数,解决掉循环问题后,这个计数就会恢复正常。
内容的提问来源于stack exchange,提问作者projectile
相关产品推荐
相关产品推荐

