# 一、简介

Spring-retry

前面我们了解到了,Guava的重试组件,我们可以基于Guava的能力,来封装我们需要的能力来满足我们的业务。今天来分享Spring-Retry重试组件。当然Spring只是帮我们封装好了,如果你不想自定义 重试组件,那么我们可以直接使用Spring的能力来实现。

API 也是非常的简单,几个注解就可以搞定。

(opens new window)

# 二、依赖

<!--springboot项目都不用引入版本号--><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><!--还是需要aop的支持的(如果已经引入了aop就不用再添加这个依赖了)--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></dependency>
12345678910

# 三、使用

# 3.1 @EnableRetry 开启重试

SpringBoot启动类上添加开启重试注解

@EnableRetry@SpringBootApplicationpublic class Application {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);}}
1234567

# 3.2 @Retryable 重试策略

在需要重试的方法上加注解@Retryable

@Retryable(value = RuntimeException.class, maxAttempts = 5, backoff = @Backoff(delay = 100))public String say(String param) {double random = Math.random();if (random > 0.1) {throw new RuntimeException("超时");}return random + "";}
12345678

  • value = RuntimeException.class:是指方法抛出RuntimeException异常时,进行重试。这里可以指定你想要拦截的异常。
  • maxAttempts:是最大重试次数。如果不写,则是默认3次。
  • backoff = @Backoff(delay = 100):是指重试间隔。delay=100意味着下一次的重试,要等100毫秒之后才能执行。

# 3.3 @Recover 重试失败

当@Retryable方法重试失败之后,最后就会调用@Recover方法。用于@Retryable失败时的“兜底”处理方法。 @Recover的方法必须要与@Retryable注解的方法保持一致,第一入参为要重试的异常,其他参数与@Retryable保持一致,返回值也要一样,否则无法执行!

@Retryable(value = IllegalAccessException.class)public void say() throws IllegalAccessException {log.info("do something... {}", LocalDateTime.now());throw new IllegalAccessException();}@Recoverpublic void sayBackup(IllegalAccessException e) {log.info("service retry after Recover => {}", e.getMessage());}
1234567891011

# 3.4 @CircuitBreaker 熔断策略

规定时间内如果重试次数达到了最大次数,开启熔断策略。 5秒内,这个方法重试了2次,就会断路。直接走@Recover修饰的方法。当超过10s后进行重置,继续走get方法。

注意@Retryable和@CircuitBreaker不要修饰同一个方法。

@CircuitBreaker(openTimeout = 5000, maxAttempts = 2,resetTimeout = 10000)public String get(@PathVariable Integer flag) {if (flag > 1) {log.info("重试进入");throw new RuntimeException("自定义异常");}return "处理正常";}@Recoverpublic String getBackup(RuntimeException runtimeException) {log.error("重试一直失败,进入备用方法:" + runtimeException.getMessage());return "备用方法进去";}
12345678910111213

属性 意思
include 指定处理的异常类。默认为空
exclude 指定不需要处理的异常。默认为空
value 指定要重试的异常。默认为空
maxAttempts 最大重试次数。默认3次
openTimeout 配置熔断器打开的超时时间,默认5s,当超过openTimeout之后熔断器电路变成半打开状态(只要有一次重试成功,则闭合电路)
resetTimeout 配置熔断器重新闭合的超时时间,默认20s,超过这个时间断路器关闭
include 指定处理的异常类。默认为空

# 3.5 RetryListener 监听器

spring-retry和guava-retry一样同样有监听器。我们可以自定义我们的监听器

@Slf4j
public class DefaultListenerSupport extends RetryListenerSupport {@Overridepublic <T, E extends Throwable> void close(RetryContext context,RetryCallback<T, E> callback, Throwable throwable) {log.info("onClose");super.close(context, callback, throwable);}@Overridepublic <T, E extends Throwable> void onError(RetryContext context,RetryCallback<T, E> callback, Throwable throwable) {log.info("onError");super.onError(context, callback, throwable);}@Overridepublic <T, E extends Throwable> boolean open(RetryContext context,RetryCallback<T, E> callback) {log.info("onOpen");return super.open(context, callback);}
}@Configuration
public class RetryConfig {@Beanpublic RetryTemplate retryTemplate() {RetryTemplate retryTemplate = new RetryTemplate();SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); //设置重试策略retryPolicy.setMaxAttempts(2);retryTemplate.setRetryPolicy(retryPolicy);FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); //设置退避策略fixedBackOffPolicy.setBackOffPeriod(2000L);retryTemplate.setBackOffPolicy(fixedBackOffPolicy);retryTemplate.registerListener(new DefaultListenerSupport()); //设置retryListenerreturn retryTemplate;}
}
123456789101112131415161718192021222324252627282930313233343536373839404142

# 3.6 RetryPolicy 重试策略

属性 意思
NeverRetryPolicy 只允许调用RetryCallback一次,不允许重试;
AlwaysRetryPolicy 允许无限重试,直到成功,此方式逻辑不当会导致死循环;
SimpleRetryPolicy 固定次数重试策略,默认重试最大次数为3次,RetryTemplate默认使用的策略;
TimeoutRetryPolicy 超时时间重试策略,默认超时时间为1秒,在指定的超时时间内允许重试;
CircuitBreakerRetryPolicy 有熔断功能的重试策略,需设置3个参数openTimeout、resetTimeout和delegate
CompositeRetryPolicy 组合重试策略,有两种组合方式,乐观组合重试策略是指只要有一个策略允许重试即可以,悲观组合重试策略是指只要有一个策略不允许重试即可以,但不管哪种组合方式,组合中的每一个策略都会执行。

# 3.7 BackOffPolicy 退避策略

下一次重试的策略。 退避是指怎么去做下一次的重试,在这里其实就是等待多长时间。

属性 意思
FixedBackOffPolicy 默认固定延迟1秒后执行下一次重试
ExponentialBackOffPolicy 指数递增延迟执行重试,默认初始0.1秒,系数是2,那么下次延迟0.2秒,再下次就是延迟0.4秒,如此类推,最大30秒。
ExponentialRandomBackOffPolicy 在上面那个策略上增加随机性
UniformRandomBackOffPolicy 这个跟上面的区别就是,上面的延迟会不停递增,这个只会在固定的区间随机
StatelessBackOffPolicy 这个说明是无状态的,所谓无状态就是对上次的退避无感知,从它下面的子类也能看出来

# 四、总结

天下代码一大抄,看你会抄不会抄。发现无论是guava还是spring的重试,基本都是类似的思路。只是看谁的功能比较鉴权而已。 guava提供了基础的能力,你任意封装。 spring基于spring提供了已经完好的能力,直接使用就好。不过因为是spring给你封装的能力,所以你要先了解清楚才行。不然可能使用错误,造成故障。

以上两款工具都挺好,不过他们都不支持分布式重试的能力。不过这已经满足我们的日常开发了,如果真遇到分布式的重试,就自己来实现咯。

Spring-retry重试组件相关推荐

  1. Spring Retry 重试机制实现及原理

    概要 Spring实现了一套重试机制,功能简单实用.Spring Retry是从Spring Batch独立出来的一个功能,已经广泛应用于Spring Batch,Spring Integration ...

  2. Spring retry重试框架

    spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断.对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法.写操作等(要考虑写是否幂等)都不适合 ...

  3. 高级JAVA - 手写简单的重试组件学习Spring Retry

    目录 一 . 定义注解 二 . 利用cglib代理扩展重试业务 三 . 编写代理类 , 使用自定义的XRetryInterceptor作为拦截器 四 . 编写相关业务方法 , 测试代码 五 . 测试结 ...

  4. 重试组件 Spring Retry

    spring-retry是spring社区的一个成员,它提供了一种对失败操作进行自动重试的能力,可以作为某些瞬时错误(例如短暂的网络抖动)的解决方案. 作为spring生态的一部分,spring-re ...

  5. foxmail邮件加载失败重试_java retry(重试) spring retry, guava retrying 详解

    系列说明 java retry 的一步步实现机制. java-retry 源码地址 情景导入 简单的需求 产品经理:实现一个按条件,查询用户信息的服务. 小明:好的.没问题. 代码 UserServi ...

  6. java retry(重试) spring retry, guava retrying 详解

    转载 自 http://blog.51cto.com/9250070/2156431 系列说明 java retry 的一步步实现机制. java-retry 源码地址 情景导入 简单的需求 产品经理 ...

  7. java retry 设置上限_java-如何设置Spring Retry模板重试最大尝试次数:无限

    我想用Spring Retry修改数据库连接的创建,以便在应用程序启动时数据库关闭时再试一次.我不想限制重试次数.我应该如何配置策略来做到这一点. 我当前的代码(我知道在这种状态下它限制为100): ...

  8. Spring异常重试框架Spring Retry

    在调用第三方接口或者使用mq时,会出现网络抖动,连接超时等网络异常,所以需要重试.为了使处理更加健壮并且不太容易出现故障,后续的尝试操作,有时候会帮助失败的操作最后执行成功.例如,由于网络故障或数据库 ...

  9. 重试框架Spring retry实践

    spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断.对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法.写操作等(要考虑写是否幂等)都不适合 ...

  10. java retry_Spring重试支持Spring Retry的方法

    本文介绍了Spring重试支持Spring Retry的方法,分享给大家,具体如下: 第一步.引入maven依赖 org.springframework.boot spring-boot-starte ...

最新文章

  1. distribution counting—a sorting method from aocp
  2. 苹果手机夜间模式怎么设置_微信夜间模式终于来了,苹果和安卓都适用!
  3. 使用选择器语法来查找元素 - 你想使用类似于CSS或jQuery的语法来查找和操作元素...
  4. Ubuntu 创建快捷方式的方法
  5. nodejs模块hashmap
  6. BackBone及其实例探究
  7. GIS_gdal geotiff文件与C# 数组array之间的转换
  8. python语言中的模块包括_python中常用的模块的总结
  9. linux存放日志的目录下,linux系统各种日志存储路径和详细介绍
  10. NeatUpload IIS6.0注册问题
  11. java 打印出库单_使用Jasperreporter生成入库出库单打印等报表操作
  12. TOGAF9中文版(二)
  13. https配置CA证书安装教程
  14. 指数函数中x的取值范围_指数函数x的取值范围是
  15. 微信小程序开发入门与实战(Behaviors使用)
  16. ubuntu unity 3D桌面效果
  17. NDS游戏《马里奥与路易》的迷你游戏《打地鼠》,玩了一晚上
  18. 全球最昂贵的10大科技产品
  19. 玩转华为数据中心交换机系列 | 配置基于MAC地址划分VLAN示例
  20. 达达,不想跳出京东舒适圈

热门文章

  1. ae怎么设置gpu渲染_AE怎么开启影驰GTX750 GPU显卡加速?AE渲染开启GPU设置教程
  2. NLP入门(八)使用CRF++实现命名实体识别(NER)
  3. 文献检索报告软件测试,文献检索报告及文献综述.doc
  4. python pandas clip
  5. Remote Sensing投稿经历
  6. 前端上传图片添加水印
  7. Qt客户端套接字QTcpSocket通过bind指定本地ip
  8. 最简单的机器学习入门:线性回归
  9. java8新特性(2)-Lambda表达式
  10. 解决“错误0x80071ac3”文件无法写入移动硬盘