
Springboot 基于@Retryable实现重试机制
最后,使用注解
创建
注解
注解
注解
注解
发布日期:2021-05-07 04:48:05
浏览次数:26
分类:精选文章
本文共 4327 字,大约阅读时间需要 14 分钟。
首先,添加依赖配置:
org.springframework.boot spring-boot-starter-aop org.springframework.retry spring-retry
其次,再Application.java
类上使用注解@EnableRetry
启动重试机制
@EnableRetrypublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); }}
最后,使用注解@Retryable
实现重试机制:
创建RetryableService.java
类
@Servicepublic class RetryableService{ /** * @param name 模拟异常标志 */ @Retryable(value = Exception.class, maxAttempts = 6, backoff = @Backoff(value = 1000)) public void doWork(String name) { System.out.println("===========do work" + name + "=============="); if ("3".equals(name)) { System.out.println("模拟异常..."); throw new RuntimeException("work error"); } }}
单元测试:
@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@WebAppConfigurationpublic class Test { @Autowired private RetryableService retryableService; @org.junit.Test public void retryableTest(){ for (int i = 0; i < 5; i++) { retryableService.doWork(String.valueOf(i)); } }}
程序输出:
===========do work0=========================do work1=========================do work2=========================do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...java.lang.RuntimeException: work error
注解@Retryable
属性说明:
- value:抛出指定异常才会重试
- maxAttempts:最大重试次数,默认为3次
- include:和value一样,默认为空,当exclude也为空时,所有异常都需要重试
- exclude:指定不处理的异常,默认为空,当include也为空时,所有异常都需要重试
- backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L
注解@Backoff
属性说明:
- value:隔多少毫秒后再次重试,默认为1000L
- delay:同value一样,默认为0
- multiplier:指定延迟倍数,默认为0,如果delay=2000L,multiplier=2,则第一次重试为2秒,第二次为4秒,第三次为8秒……
注解@Recover
说明:
注解@Retryable
重试还是失败后的回调处理.
注解@Retryable
代码实现:
@Servicepublic class RetryableService{ /** * @param name 模拟异常标志 */ @Retryable(value = Exception.class, maxAttempts = 6, backoff = @Backoff(value = 1000)) public void doWork(String name) { System.out.println("===========do work" + name + "=============="); if ("3".equals(name)) { System.out.println("模拟异常..."); throw new RuntimeException("work error"); } } /** * 重试失败后的回调处理 * @param e */ @Recover public void doWorkRecover(Exception e){ System.out.println("doWorkRecover = " + e.getMessage()); }}
程序输出:
===========do work0=========================do work1=========================do work2=========================do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...===========do work3==============模拟异常...doWorkRecover = work error===========do work4==============
⚠️注意:在使用@Recover
和@Retryable
时,要在spring容器中管理的bean里面使用,例如下面这种场景不会生效。
@Servicepublic class RetryableService{ public void doWork1(String name){ doWork(name); } /** * @param name 模拟异常标志 */ @Retryable(value = Exception.class, maxAttempts = 6, backoff = @Backoff(value = 1000)) public void doWork(String name) { System.out.println("===========do work" + name + "=============="); if ("3".equals(name)) { System.out.println("模拟异常..."); throw new RuntimeException("work error"); } } /** * 重试失败后的回调处理 * @param e */ @Recover public void doWorkRecover(Exception e){ System.out.println("doWorkRecover = " + e.getMessage()); throw new RuntimeException("doWorkRecover error"); }}
@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@WebAppConfigurationpublic class Test { @Autowired private RetryableService retryableService; @org.junit.Test public void retryableTest(){ for (int i = 0; i < 5; i++) { retryableService.doWork1(String.valueOf(i)); } }}
程序输出:
===========do work0=========================do work1=========================do work2=========================do work3==============模拟异常...java.lang.RuntimeException: work error
欢迎关注我的微信公众号,里面有很多干货,各种面试题

发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月28日 01时09分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ASP.NET Core on K8S学习之旅(12)Ingress
2021-05-09
重新温习软件设计之路(4)
2021-05-09
《刷新》:拥抱同理心,建立成长型思维
2021-05-09
MVC3+NHibernate项目实战(二) :数据库访问层
2021-05-09
Flask入门
2021-05-09
MySQL数据库与python交互
2021-05-09
python如何对字符串进行html转义与反转义?
2021-05-09
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2021-05-09
java例题_24 逆向输入数字
2021-05-09
不管人生怎么走,都需要实时回头看看
2021-05-09
golang基础--类型与变量
2021-05-09
Bitcoin区块链攻击方式
2021-05-09
.NetCore外国一些高质量博客分享
2021-05-09
Mysql的基本操作(一)增、删、改
2021-05-09
整理一些常用的前端CND加速库,VUE,Jquery,axios
2021-05-09
FFmpeg调用c语言SDK实现日志的打印
2021-05-09
WebRTC的运行流程和运行机制到底是怎么进行的
2021-05-09