有时候会因为短暂的故障,导致 Batch 执行失败,如网络抖动等,为了 Batch 的健壮性,这个时候就需要重试几次,以排除因为短暂因素造成的 Batch 状态失败。
需要指出的是从 Spring Batch 2.2.0 之后的版本,Retry 已经独立成一个单独的 Jar。
重试的 Batch 设置:
retry()
源码如下:
public FaultTolerantStepBuilder<I, O> retry(Class<? extends Throwable> type) {
retryableExceptionClasses.put(type, true);
return this;
}
定义捕获到需要重试的异常,可以多次调用,每次调用都会将异常加到列表里面。
noRetry()
源码如下:
public FaultTolerantStepBuilder<I, O> noRetry(Class<? extends Throwable> type) {
retryableExceptionClasses.put(type, false);
return this;
}
每次调用将参数加到需要排除的异常列表里面。
retryLimit()
源码如下:
public FaultTolerantStepBuilder<I, O> retryLimit(int retryLimit) {
this.retryLimit = retryLimit;
return this;
}
最大可重试次数。操过这个次数就会直接失败。
retryContextCache()
源码如下:
public FaultTolerantStepBuilder<I, O> retryContextCache(RetryContextCache retryContextCache) {
this.retryContextCache = retryContextCache;
return this;
}
用来存放 RetryContext 的缓存。
retryPolicy()
源码如下:
public FaultTolerantStepBuilder<I, O> retryPolicy(RetryPolicy retryPolicy) {
this.retryPolicy = retryPolicy;
return this;
}
一些简单的重试,可以通过 retry(),noRetry()和retryLimit() 配置来实现重试。Spring Batch 还支持通过设置RetryPolicy 来实现复杂逻辑的重试。RetryPolicy(重试策略)接口定义如下:
canRetry() 如何判断是否可以重试,open()在重试开始时执行,close()在重试结束是执行,每次重试调用一次registerThrowable()来初始化上下文。
系统默认提供了以下几个实现类:
具体实现类的作用,参见下表:
实现类 | 作用 |
---|---|
NeverRetryPolicy | 只允许调用RetryCallback一次,不允许重试 |
AlwaysRetryPolicy | 允许无限重试,直到成功,此方式逻辑不当会导致死循环 |
SimpleRetryPolicy | 固定次数重试策略,默认重试最大次数为3次,RetryTemplate默认使用的策略 |
TimeoutRetryPolicy | 超时时间重试策略,默认超时时间为1秒,在指定的超时时间内允许重试 |
CircuitBreakerRetryPolicy | 有熔断功能的重试策略,需设置3个参数openTimeout、resetTimeout和delegate, |
CompositeRetryPolicy | 组合重试策略,有两种组合方式,乐观组合重试策略是指只要有一个策略允许重试即可以,悲观组合重试策略是指只要有一个策略不允许重试即可以,但不管哪种组合方式,组合中的每一个策略都会执行 |
ExceptionClassifierRetryPolicy | 为不同的异常指定不同的重试策略 |