重试机制
Spring 重试机制
如今,
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.2.RELEASE</version>
</dependency>
然后在应用中包含
@Retryable(maxAttempts=5,backoff = @Backoff(delay = 3000))
public void retrySomething() throws Exception{
logger.info("printSomething{} is called");
thrownew SQLException();
}
在上面这个案例当中的重试策略就是重试
- **delay:
** 如果不设置的话默认是1 秒 - **maxDelay:
** 最大重试等待时间 - **multiplier:
** 用于计算下一个延迟时间的乘数( 大于0 生效) - **random:
** 随机重试等待时间( 一般不用)
- 属于
Spring 大生态,使用起来不会太生硬; - 只需要在需要重试的方法上加上注解并配置重试策略属性就好,不需要太多侵入代码。
但同时也存在两个主要不足:
- 第一,由于
Spring Retry 用到了Aspect 增强,所以就会有使用Aspect 不可避免的坑——方法内部调用,如果被@Retryable 注解的方法的调用方和被调用方处于同一个类中,那么重试将会失效; - 第二,
Spring 的重试机制只支持对异常进行捕获,而无法对返回值进行校验判断重试。如果想要更灵活的重试策略可以考虑使用Guava Retry ,也是一个不错的选择。