文章目录

  • 系列文章目录
    • Springboot集成Netty
    • Springboot集成Rabbitmq
    • Springboot集成Retry
    • springboot集成websocket
    • Springboot集成Redis
    • springboot整合rabbitmq使用示例
  • 前言
  • 一、spring-retry是什么?
  • 二、使用步骤
    • 1.引入maven库
    • 2. 在spring启动类上开启重试功能
    • 2.公共业务代码
    • 3. 以往的重试做法
    • 4. 使用spring-retry的命令式编码
      • 4.1 定义重试监听器
      • 4.2 定义重试配置
      • 4.3 命令式编码
    • 5 使用spring-retry的注解式编码
    • 6 启动打印效果
  • 三、总结
  • 四、示例源码

系列文章目录

Springboot集成Netty

Springboot集成Rabbitmq

Springboot集成Retry

springboot集成websocket

Springboot集成Redis

springboot整合rabbitmq使用示例


前言

以往我们在进行网络请求的时候,需要考虑网络异常的情况,本文就介绍了利用spring-retry框架进行网络异常重试的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、spring-retry是什么?

是spring提供的一个重试框架,原本自己实现的重试机制,现在spring帮封装好提供更加好的编码体验。

二、使用步骤

1.引入maven库

代码如下(示例):

 <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.9.RELEASE</version></dependency>

2. 在spring启动类上开启重试功能

提示:添加@EnableRetry注解开启

@SpringBootApplication
@EnableRetry
public class SpringRetryDemoApplication {public static SpringRetryAnnotationService springRetryAnnotationService;public static SpringRetryImperativeService springRetryImperativeService;public static TranditionalRetryService tranditionalRetryService;@Autowiredpublic void setSpringRetryAnnotationService(SpringRetryAnnotationService springRetryAnnotationService) {SpringRetryDemoApplication.springRetryAnnotationService = springRetryAnnotationService;}@Autowiredpublic void setSpringRetryImperativeService(SpringRetryImperativeService springRetryImperativeService) {SpringRetryDemoApplication.springRetryImperativeService = springRetryImperativeService;}@Autowiredpublic void setTranditionalRetryService(TranditionalRetryService tranditionalRetryService) {SpringRetryDemoApplication.tranditionalRetryService = tranditionalRetryService;}public static void main(String[] args) {SpringApplication.run(SpringRetryDemoApplication.class, args);springRetryAnnotationService.test();springRetryImperativeService.test();tranditionalRetryService.test();}}

2.公共业务代码

@Service
@Slf4j
public class CommonService {public void test(String before) {for (int i = 0; i < 10; i++) {if (i == 2) {log.error("{}:有异常哦,我再试多几次看下还有没异常", before);throw new RuntimeException();}log.info("{}:打印次数: {}", before, i + 1);}}public void recover(String before) {log.error("{}:还是有异常,程序有bug哦", before);}
}

3. 以往的重试做法

@Service
@Slf4j
public class TranditionalRetryService {@AutowiredCommonService commonService;public void test() {// 定义重试次数以及重试时间间隔int retryCount = 3;int retryTimeInterval = 3;for (int r = 0; r < retryCount; r++) {try {commonService.test("以前的做法");} catch (RuntimeException e) {if (r == retryCount - 1) {commonService.recover("以前的做法");return;}try {Thread.sleep(retryTimeInterval * 1000);} catch (InterruptedException ex) {ex.printStackTrace();}}}}
}

4. 使用spring-retry的命令式编码

4.1 定义重试监听器

提示:监听重试过程的生命周期

@Slf4j
public class MyRetryListener extends RetryListenerSupport {@Overridepublic <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {log.info("监听到重试过程关闭了");log.info("=======================================================================");}@Overridepublic <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {log.info("监听到重试过程错误了");}@Overridepublic <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {log.info("=======================================================================");log.info("监听到重试过程开启了");return true;}}

4.2 定义重试配置

提示:配置RetryTemplate重试模板类

@Configuration
public class RetryConfig {@Beanpublic RetryTemplate retryTemplate() {// 定义简易重试策略,最大重试次数为3次,重试间隔为3sRetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(3).fixedBackoff(3000).retryOn(RuntimeException.class).build();retryTemplate.registerListener(new MyRetryListener());return retryTemplate;}}

4.3 命令式编码

@Service
@Slf4j
public class SpringRetryImperativeService {@AutowiredRetryTemplate retryTemplate;@AutowiredCommonService commonService;public void test() {retryTemplate.execute(retry -> {commonService.test("命令式");return null;},recovery -> {commonService.recover("命令式");return null;});}
}

5 使用spring-retry的注解式编码

@Service
@Slf4j
public class SpringRetryAnnotationService {@AutowiredCommonService commonService;/*** 如果失败,定义重试3次,重试间隔为3s,指定恢复名称,指定监听器*/@Retryable(value = RuntimeException.class, maxAttempts = 3, backoff = @Backoff(value = 3000L), recover = "testRecover", listeners = {"myRetryListener"})public void test() {commonService.test("注解式");}@Recoverpublic void testRecover(RuntimeException runtimeException) {commonService.recover("注解式");}
}

6 启动打印效果

2022-05-06 11:53:12.044  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : =======================================================================
2022-05-06 11:53:12.044  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程开启了
2022-05-06 11:53:12.048  INFO 21812 --- [           main] c.e.s.service.CommonService              : 注解式:打印次数: 1
2022-05-06 11:53:12.048  INFO 21812 --- [           main] c.e.s.service.CommonService              : 注解式:打印次数: 2
2022-05-06 11:53:12.049 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 注解式:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:12.049  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程错误了
2022-05-06 11:53:15.062  INFO 21812 --- [           main] c.e.s.service.CommonService              : 注解式:打印次数: 1
2022-05-06 11:53:15.062  INFO 21812 --- [           main] c.e.s.service.CommonService              : 注解式:打印次数: 2
2022-05-06 11:53:15.062 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 注解式:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:15.062  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程错误了
2022-05-06 11:53:18.065  INFO 21812 --- [           main] c.e.s.service.CommonService              : 注解式:打印次数: 1
2022-05-06 11:53:18.065  INFO 21812 --- [           main] c.e.s.service.CommonService              : 注解式:打印次数: 2
2022-05-06 11:53:18.065 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 注解式:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:18.065  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程错误了
2022-05-06 11:53:18.066 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 注解式:还是有异常,程序有bug哦
2022-05-06 11:53:18.066  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程关闭了
2022-05-06 11:53:18.066  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : =======================================================================
2022-05-06 11:53:18.067  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : =======================================================================
2022-05-06 11:53:18.067  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程开启了
2022-05-06 11:53:18.067  INFO 21812 --- [           main] c.e.s.service.CommonService              : 命令式:打印次数: 1
2022-05-06 11:53:18.067  INFO 21812 --- [           main] c.e.s.service.CommonService              : 命令式:打印次数: 2
2022-05-06 11:53:18.067 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 命令式:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:18.067  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程错误了
2022-05-06 11:53:21.079  INFO 21812 --- [           main] c.e.s.service.CommonService              : 命令式:打印次数: 1
2022-05-06 11:53:21.079  INFO 21812 --- [           main] c.e.s.service.CommonService              : 命令式:打印次数: 2
2022-05-06 11:53:21.079 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 命令式:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:21.079  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程错误了
2022-05-06 11:53:24.082  INFO 21812 --- [           main] c.e.s.service.CommonService              : 命令式:打印次数: 1
2022-05-06 11:53:24.082  INFO 21812 --- [           main] c.e.s.service.CommonService              : 命令式:打印次数: 2
2022-05-06 11:53:24.082 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 命令式:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:24.082  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程错误了
2022-05-06 11:53:24.082 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 命令式:还是有异常,程序有bug哦
2022-05-06 11:53:24.082  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : 监听到重试过程关闭了
2022-05-06 11:53:24.082  INFO 21812 --- [           main] c.e.s.listener.MyRetryListener           : =======================================================================
2022-05-06 11:53:24.082  INFO 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:打印次数: 1
2022-05-06 11:53:24.083  INFO 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:打印次数: 2
2022-05-06 11:53:24.083 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:27.084  INFO 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:打印次数: 1
2022-05-06 11:53:27.084  INFO 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:打印次数: 2
2022-05-06 11:53:27.084 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:30.090  INFO 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:打印次数: 1
2022-05-06 11:53:30.090  INFO 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:打印次数: 2
2022-05-06 11:53:30.090 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:有异常哦,我再试多几次看下还有没异常
2022-05-06 11:53:30.090 ERROR 21812 --- [           main] c.e.s.service.CommonService              : 以前的做法:还是有异常,程序有bug哦

三、总结

本文仅仅简单介绍了spring-retry的基本使用,相较于以往的做法,个人认为注解式更为简便,命令式看个人喜好,更多使用方法参照github主页

https://github.com/spring-projects/spring-retry

四、示例源码

https://gitee.com/teajoy/springboot-modules/tree/master/springboot-retry

spring-retry使用介绍相关推荐

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

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

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

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

  3. 针对Spring的Spring Retry 我发现了这样一个大家都不知道的技巧!

    外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取.重试策略在服务治理方面也有很广泛 ...

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

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

  5. Spring retry重试框架

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

  6. 重试框架Spring retry实践

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

  7. Spring Retry使用

    由于场景需求,需要对项目依赖的部分外部接口添加响应超时重试机制,而Spring Retry可以满足该需求,因此进行相关资料查询.对于Spring Retry的使用,网上的资料主要是采用注解的方式实现, ...

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

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

  9. Spring Retry 请求重试指南

    1 前言 在实际开发中, 例如在系统请求其他系统或资源的外部调用.操作时,由于网络故障等问题会造成短时间内失败. 我们希望当操作失败时,将使用重试策略来重试该操作. 2 添加依赖 <depend ...

  10. Spring Security 基本介绍,初窥路径

    Spring Security 基本介绍和环境搭建 实验介绍 Spring Security 是一个非常强大的身份验证和授权控制框架.为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过 ...

最新文章

  1. Grails GORM查询总结
  2. 本地安装gem install --local redis-stat-0.4.13.gem
  3. vb6 串口同时读取写入数据怎么避免冲突_实例:S7-200 SMART通过Modbus-RTU读取温湿度传感器数据...
  4. pymongo查询列表元素_Python数据类型之列表list
  5. 如何让普通用户可以对DBA_SOURCE视图进行闪回查询?
  6. socket 例子 java_java socket例子
  7. 【正在等待可用套接字】解决方法
  8. 《精解 Windows 10》——2.10 触摸手势
  9. python教程视频哪个好-Python入门视频哪个好?
  10. layui 滚动加载与ajax,909422229_layUi关于ajax与loading问题
  11. 国内外著名CAD、CAM雕刻软件介绍
  12. java web gradle_java web使用gradle配置详情
  13. android 渐变歌词,Android UI之自定义——最简单的仿QQ音乐歌词颜色渐变
  14. win10默认壁纸_Win10系统待机锁频壁纸怎么提取?
  15. 定位position-relative
  16. 一阶线性常微分方程解法
  17. PyTorch深度学习(18)网络结构LeNet、AlexNet
  18. 专业服务器主用与托管、
  19. pytorch训练神经网络loss刚开始下降后来停止下降的原因
  20. P1000 超级玛丽游戏

热门文章

  1. NOI Online 2022
  2. matlab画复平面,用Matlab绘制复变函数
  3. Tom-Skype命令行参数
  4. 毕昇配置pytorch
  5. 在visual studio 2019下安装ipopt并实现非线性规划求解(C++)
  6. 小程序 实现一分钟倒计时
  7. 如何组装一台安全机器人?天线是必不可少的组件
  8. 优化切尔诺贝利灾难模型——附matlab代码
  9. 思科认证安全工程师一分钟学会思科防火墙的基本配置 实用收藏
  10. ELMo: Deep contextualized word representations