Spring Batch 遇到坏数据怎么办?skip 和 retry 怎么用?writer 失败为什么会被调用那么多次?skipLimit 超了会怎样?失败后重启是从断点继续还是从头来?这篇在 Spring Batch 6.0.5 和 MySQL 上逐项实测。
Job FAILED/Step FAILED,read=10 write=0 skip=0(读 0/处理 0/写 0) commit=0 rollback=1,失败原因 FatalStepExecutionException,表里 0 行
任何异常让步骤失败,当前 chunk 回滚。
Job COMPLETED/Step COMPLETED,read=30 write=29 skip=1(读 0/处理 1/写 0) commit=3 rollback=0,处理器被调用 30 次,表里 29 行,缺的是 [7]
processor 异常就地跳过。
Job FAILED/Step FAILED,read=10 write=0 skip=2(读 0/处理 2/写 0) commit=0 rollback=1,失败原因 FatalStepExecutionException,表里 0 行
当前 chunk 整块回滚。
Job COMPLETED/Step COMPLETED,read=30 write=29 skip=1(读 0/处理 0/写 1) commit=3 rollback=2,writer 被调用 13 次,表里 29 行,缺的是 [15]
回滚后逐条重写,调用次数暴增。
Job COMPLETED/Step COMPLETED,read=10 write=10 skip=0(读 0/处理 0/写 0) commit=1 rollback=0,处理器被调用 12 次(10 条 + 额外的 2 次重试),表里 10 行 第 5 条前 3 次都抛 Transient,retryLimit(2):Job FAILED/Step FAILED,read=10 write=0 skip=0(读 0/处理 0/写 0) commit=0 rollback=1,失败原因 FatalStepExecutionException,处理器被调用 7 次,表里 0 行 第 5 条前 3 次都抛 Transient,retryLimit(3):Job COMPLETED/Step COMPLETED,read=10 write=10 skip=0(读 0/处理 0/写 0) commit=1 rollback=0,处理器被调用 13 次,表里 10 行
retryLimit(n) = 最多重试 n 次。
[ListItemReader(不可重启的读取器)] 第一次:Job FAILED/Step FAILED,read=300 write=200 skip=0(读 0/处理 0/写 0) commit=2 rollback=1,失败原因 FatalStepExecutionException,表里 200 行
第二次(同参数重启):Job COMPLETED/Step COMPLETED,read=1000 write=1000 skip=0(读 0/处理 0/写 0) commit=10 rollback=0,表里 1200 行,去重后 1000 行;同一个 JobInstance 下的执行数 2,两次的 JobInstance 是否相同 true
[JdbcCursorItemReader(有名字,会保存读取位置)] 第一次:Job FAILED/Step FAILED,read=300 write=200 skip=0(读 0/处理 0/写 0) commit=2 rollback=1,失败原因 FatalStepExecutionException,表里 200 行
第二次(同参数重启):Job COMPLETED/Step COMPLETED,read=800 write=800 skip=0(读 0/处理 0/写 0) commit=8 rollback=0,表里 1000 行,去重后 1000 行;同一个 JobInstance 下的执行数 2,两次的 JobInstance 是否相同 true读取器可重启才能从断点继续。