当由于网络波动或者资源被锁等情况需要再次尝试的时候,可以使用spring-retry项目来实现,该项目已经应用到 Spring Batch, Spring Integration等项目。

spring-boot项目使用spring-retry非常简单,在配置类加上@EnableRetry注解启用spring-retry,然后在需要失败重试的方法加@Retryable注解即可,spring-retry通过捕获异常来触发重试机制。

@Retryable

注意: 不能用于接口的实现类

  @Retryable(value = RemoteAccessException.class, maxAttempts = 30,backoff= @Backoff(value = 10, maxDelay = 100000, multiplier = 3))public String getUser(Integer id){if (id == 444) {throw new RemoteAccessException(String.valueOf(id));}}

参数说明

value

需要进行重试的异常,和参数includes是一个意思。默认为空,当参数exclude也为空时,所有异常都将要求重试。

include

需要进行重试的异常,默认为空。当参数exclude也为空时,所有异常都将要求重试。

exclude

不需要重试的异常。默认为空,当参include也为空时,所有异常都将要求重试。

stateful

标明重试是否是有状态的,异常引发事物失效的时候需要注意这个。该参数默认为false。远程方法调用的时候不需要设置,因为远程方法调用是没有事物的;只有当数据库更新操作的时候需要设置该值为true,特别是使用Hibernate的时候。抛出异常时,异常会往外抛,使事物回滚;重试的时候会启用一个新的有效的事物。

maxAttempts

最大重试次数,默认为3。包括第一次失败。

backoff

回避策略,默认为空。该参数为空时是,失败立即重试,重试的时候阻塞线程。

详细参数参看@Backoff说明。

exceptionExpression

SimpleRetryPolicy.canRetry()返回true时该表达式才会生效,触发重试机制。如果抛出多个异常,只会检查最后那个。
表达式举例:

"message.contains('you can retry this')"

并且

"@someBean.shouldRetry(#root)"

@Backoff

参数说明

value

重试延迟时间,单位毫秒,默认值1000,即默认延迟1秒。

当未设置multiplier时,表示每隔value的时间重试,直到重试次数到达maxAttempts设置的最大允许重试次数。当设置了multiplier参数时,该值作为幂运算的初始值。

等同delay参数,两个参数设置一个即可。

delay

参看value说明。

maxDelay

两次重试间最大间隔时间。当设置multiplier参数后,下次延迟时间根据是上次延迟时间乘以multiplier得出的,这会导致两次重试间的延迟时间越来越长,该参数限制两次重试的最大间隔时间,当间隔时间大于该值时,计算出的间隔时间将会被忽略,使用上次的重试间隔时间。

multiplier

作为乘数用于计算下次延迟时间。公式:

delay = delay * multiplier

random

是否启用随机退避策略,默认false。设置为true时启用退避策略,重试延迟时间将是delaymaxDelay间的一个随机数。设置该参数的目的是重试的时候避免同时发起重试请求,造成Ddos攻击。

@Recover

该注解用于恢复处理方法,当全部尝试都失败时执行。返回参数必须和@Retryable修饰的方法返回参数完全一样。第一个参数必须是异常,其他参数和@Retryable修饰的方法参数顺序一致。

  @Recoverpublic String recover(RemoteAccessException remoteaccessException, Integer id){// 全部重试失败处理}

参考

demo: https://github.com/clj198606061111/spring-boot-retry-demo

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

原文: http://www.itclj.com/blog/59940a4081c06e672f942ae1

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

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

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

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

  7. Spring异常重试框架Spring Retry

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

  8. Spring retry重试框架

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

  9. Spring Retry # Stateful Retry

    Spring Retry中的重试,分为无状态的重试和有状态的重试: 简述 有状态重试通常是用在message-driven 的应用中,从消息中间件比如RabbitMQ等接收到的消息,如果应用处理失败, ...

  10. 重试框架Spring retry实践

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

最新文章

  1. Java基础篇:回调机制详解
  2. python输出数字方阵_在python里输出数字方阵
  3. git-版本的回退操作与
  4. 南京财经大学计算机专业读研,计算机考研报录比比较的院校:南京财经大学
  5. 数据结构之基于Java的二叉树实现
  6. 解析函數論 Page 28 連續復變函數的最簡單的性質
  7. php MySQLDB类
  8. System.Diagnostics.Process的常见用法
  9. Flash,EEPROM差别
  10. 研发数据安全解决方案
  11. 颜色的原理,三基色原理以及HLS(色相、亮度、饱和度)原理
  12. 【读书笔记】合理的设计
  13. ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event.
  14. win10下安装php7.2的memcache扩展
  15. POJ 1625 Censored!(AC自动机-指针版+DP+大数)题解
  16. 3. 自定义Java编译时注解处理器
  17. 超详细分解c 语言——实现扫雷游戏(详解)
  18. j2cache两级缓存框架
  19. OpenCv图像处理之图像视频摄像头读取和保存
  20. 【推拉框-手风琴】vue3实现手风琴效果的组件

热门文章

  1. 安卓集成网易云信SDK实现登录功能
  2. Python调用cmd
  3. python :脚本运行出现语法错误:IndentationError:unexpected indent(缩进问题)
  4. 新世纪版五笔字根高清版
  5. eclipse写入mysql乱码问题_怎么办eclipse向mysql插入数据出现乱码
  6. 安腾处理器 oracle,英特尔展示下一代安腾处理器Poulson
  7. Allegro 的一些实用操作技巧
  8. 什么是似然函数?是条件概率吗?
  9. 【统计学笔记】各种假设检验的假设的建立和各统计量公式总结
  10. win10计算机如何调到桌面上,win10系统下怎么将计算器放在桌面上