spring-batch提供了批处理的异常重试机制,主要有两种。重试和跳过。
1.重试(retry)
在step中可以设置,本step运行的重试机制。主要包括:重试的异常,忽略的异常,重试的次数以及重试的监听
@StepScope
@Bean
public Step userStep() {
return stepBuilderFactory.get("userStep")
.chunk(2)
.reader(userReader)
.processor(userProcess)
.writer(userWriter)
//异常重试
.faultTolerant()
.retry(Exception.class)
.retryLimit(10)
.listener(demoRetryListener)
.build();
}
重试机制中,当数据批处理过程中发生异常时对批处理进行重试,重试的位置为配置的chunk批次当前批次开始的位置。(spring-batch在运行时会记录批处理运行状态及运行位置)。当重试次数超过设置的最大重试次数之后,JOB会失败。
在重试过程中可以通过监听,来监听失败成功的数据,监听器代码见下
package com.flight.neon.batch.demo.job.listener;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;
import org.springframework.retry.RetryListener;
import org.springframework.stereotype.Component;
/**
* @author 这个码农不太萌
*/
@Component
public class DemoRetryListener implements RetryListener {
@Override
public boolean open(RetryContext retryContext, RetryCallback retryCallback) {
System.out.println("open");
return true;
}
@Override
public void close(RetryContext retryContext, RetryCallback retryCallback, Throwable throwable) {
System.out.println("close");
}
@Override
public void onError(RetryContext retryContext, RetryCallback retryCallback, Throwable throwable) {
System.out.println("onError");
}
}
2.跳过(skip)
在step中可以设置异常跳过。主要设置参数为跳过的异常,忽略的异常,跳过次数,监听等。当JOB运行时异常发生次数大于设置的跳过数,JOB会失败。
@StepScope
@Bean
public Step userStep() {
return stepBuilderFactory.get("userStep")
.chunk(2)
.reader(userReader)
.processor(userProcess)
.writer(userWriter)
//异常跳过
.faultTolerant()
.skip(Exception.class)
.skipLimit(2)
.listener(demoSkipListener)
.build();
}
在skip的监听中可以监听数据为何跳过,是read/process/writer哪个位置出现了异常,代码示例见下
package com.flight.neon.batch.demo.job.listener;
import org.springframework.batch.core.SkipListener;
import org.springframework.stereotype.Component;
/**
* @author 这个码农不太萌
*/
@Component
public class DemoSkipListener implements SkipListener {
@Override
public void onSkipInRead(Throwable throwable) {
}
@Override
public void onSkipInWrite(Object o, Throwable throwable) {
}
@Override
public void onSkipInProcess(Object o, Throwable throwable) {
}
}