目录

一 . 引入依赖

二 . 在启用类或业务类上添加@EnableRetry注解启用重试机制(在启用类上添加全局有效 , 在业务类上添加仅当前有效)

三 . 使用@Retryable实现重试

四 . 使用@Recover执行补偿方法

五 . 测试及结果

六 . 常用属性说明

七 . 常见问题


在业务场景中 , 有时候会遇到异常后需要重复尝试的操作 , 例如调用三方接口 , 发送邮件/短信 , 推送消息等等 . 
Spring 提供了Retry组件 , 很方便的解决了上述问题

项目源代码 : https://download.csdn.net/download/xingbaozhen1210/11384277

一 . 引入依赖

        <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.2.4.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>

二 . 在启用类或业务类上添加@EnableRetry注解启用重试机制(在启用类上添加全局有效 , 在业务类上添加仅当前有效)

package cn.xing.demo.retry;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;@SpringBootApplication
@EnableRetry//启用重试机制
public class RetryApplication {public static void main(String[] args) {SpringApplication.run(RetryApplication.class, args);}
}

三 . 使用@Retryable实现重试

    /** @Retryable() = @Retryable(maxAttempts = 3) , 出现任意异常后再重试2次 */@Retryable()public void work1() {System.out.println("执行方法1 : " + LocalDateTime.now());throw new RuntimeException();//模拟异常}/** 出现指定异常时(RuntimeException) , 再重试3次 , 每次延迟5s , 之后每次延迟翻倍*/@Retryable(include = {RuntimeException.class}, maxAttempts = 4, backoff = @Backoff(delay = 2000L, multiplier = 2))public void work2() {System.out.println("执行方法2 : " + LocalDateTime.now());throw new RuntimeException();//模拟异常}

四 . 使用@Recover执行补偿方法

即使重试之后 , 仍然因为各种原因导致失败 , 这时候就可以在补偿方法中记录异常或采用其他措施

    /** 出现指定异常时(NullPointerException) */@Retryable(include = NullPointerException.class)public void work3() {System.out.println("执行方法3 : " + LocalDateTime.now());throw new NullPointerException();//模拟异常}/** 当重试次数达到限定时 , 会执行@Recover注解的补偿方法 , 只有在入参与发生异常匹配时才会执行该补偿方法 */@Recoverpublic void recover(NullPointerException e) {System.out.println("执行补偿方法 : " + LocalDateTime.now());}

五 . 测试及结果

package cn.xing.demo.retry;import cn.xing.demo.retry.service.WorkService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class RetryTest {@Autowiredprivate WorkService workService;@Testpublic void test1() {workService.work1();}@Testpublic void test2() {workService.work2();}@Testpublic void test3() {workService.work3();}
}

六 . 常用属性说明

@Retryablevalue : 指定发生的异常进行重试 include : 同value , 默认"" , 当exclude也为空时 , 所有异常都重试 exclude : 排除不重试的异常 , 默认"" , 当include也为空时 , 所有异常都重试maxAttemps : 尝试次数 , 默认3 . 注意该值包含第一次正常执行的次数 , 即失败之后重新尝试2次 , 一共执行3次backoff : 重试补偿机制 , 默认无 , 属性配置如下@Backoffdelay : 延迟指定时间后(单位毫秒)重试multiplier : 指定延迟的倍数 , 每次执行间隔加倍延迟 . 如delay=5000L,multiplier=2 , 第一次重 试为5S后 , 第二次为第一次的10S后 , 第三次为第二次的20S后

七 . 常见问题

1 . maxAttemps 参数为尝试次数 , 而非重试次数 . 即=3时 , 会重试2次 , =4时会重试3次 , 因为它包括了首次正常执行的计数
2 . retry利用了Spring AOP的原理 , 所以底层采用了代理的技术 , 所有同一个类内调用会使代理失效
    public void work1(){
        work2();
    }
    @Retryable()//work2方法不会执行重试
    public void work2(){
        //...
    }
3 . 有关非幂等的操作(如新增,修改等) , 不要使用重试 , 会影响数据一致性

Spring异常重试机制 - Spring Retry相关推荐

  1. Spring异常重试框架Spring Retry

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

  2. java retry_Spring异常重试框架Spring Retry详解

    Spring Retry支持集成到Spring或者Spring Boot项目中,而它支持AOP的切面注入写法,所以在引入时必须引入aspectjweaver.jar包. 快速集成的代码样例: @Con ...

  3. rabbimq消费者实现异常重试机制

    功能描述 异常重试指的是当消费者处理消息异常失败时,为保证数据最终一致性,通过设置重试策略来对消息进行重复再消费.对于重试策略我们指定延迟多长时间重试一次,重试多少次,以及时间单位等. 策略描述 原理 ...

  4. 解决网络波动数据传输问题——spring的重试机制@Retryable

    文章目录 前言 常用参数介绍 依赖 用法 前言 不知道大家平时在对数据进行同步传输,或者消息发送等操作由于网络波动的时候是如何操作的,记日志?邮件通知管理员?插入数据监控系统?但是如果仅仅是短暂的网络 ...

  5. springboot 整合retry(重试机制)

    当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的 ...

  6. Spring事务传播机制以及事务嵌套

    Spring事务传播机制以及事务嵌套 Spring事务传播机制 事务嵌套场景 情景0: 场景1:不同类中,开启事务的方法调用没有开启事务的方法 场景2:不同类中,methodA方法嵌套methodB方 ...

  7. Spring的事件机制

    Spring的事件机制 Spring的事件机制 自定义一个事件 发布一个事件 监听器 深入Spring源码 Spring的事件机制 自定义一个事件 通过继承ApplicationEvent自定义事件 ...

  8. 【转载】Java重试机制

    重试机制在分布式系统中,或者调用外部接口中,都是十分重要的. 重试机制可以保护系统减少因网络波动.依赖服务短暂性不可用带来的影响,让系统能更稳定的运行的一种保护机制. 为了方便说明,先假设我们想要进行 ...

  9. RabbitMQ中重试机制的坑

    当我们消息消费失败的时候,可以进行重试,虽然SpringAMQP集成了retry机制,但是发现使用过程有点坑,等会细说 重试机制使用场景: 1.如果是业务代码,比如空指针之类的异常那重试机制其实没什么 ...

最新文章

  1. 区块链论文:OmniLedger,一种区块链分片技术
  2. Java语言编码规范(2)
  3. oracle的基本内存结构有,oracle内存结构(一)
  4. python图片横向合并_python3 图片横向合并
  5. java怎么实现日程提醒_如何用java和xml实现日程提醒
  6. java 获取周日期_java 获得本周一到周五的日期
  7. javascript 基础之事件(event)-------1
  8. 在思科路由器上配置SSH登录
  9. DXF格式文件导入AD,做成可加工的PCB文件
  10. F2FS 基础知识一
  11. iPhone屏幕尺寸、分辨率及适配
  12. 【数据分析】决策树案例详解
  13. Tbase 源码 (一)
  14. r语言和python混合_jupyter notebook同时使用python和R语言
  15. Excel生成指定范围内随机数
  16. 相同的js文件在IE浏览器可以响应,但是在Chrome浏览器上没有响应
  17. 如何重设思科路由器密码并保持配置不丢失?
  18. sql之conver函数的使用
  19. Java开发——IDEA
  20. python中split()方法的使用

热门文章

  1. 12-sed命令详解
  2. ZeroC ICE源代码中的那些事 - 嵌套类和局部类
  3. 3-2 :eq(index)过滤选择器
  4. kaptcha小案例(转)
  5. asp.net配置IIS过程错误解决
  6. NET sturct值类型
  7. css3弹性盒子、媒体查询、多列布局
  8. Python 列表 sorted( )函数
  9. Python 列表 count( )方法
  10. JQuery源码笔记jQuery.access研究学习(13)