@Retryable和@Recover实现了重处理,重处理的场景是十分常见的,例如发起网络请求的时候,经常会因为网络波动等原因造成请求失败,产生异常,这时候可以使用@Retryable和@Recover简单的实现重处理。

添加maven依赖。

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

贴上demo代码。

* @author hsw * @Date 17:29 2018/7/23 @Slf4j @EnableRetry @Component public class RecoryTest { public void test () { retry(); @Retryable(value = {RetryException.class},//指定发生的异常进行重试 maxAttempts=3, //重试次数,默认即为3 backoff = @Backoff(value = 2000))//每次重试延迟毫秒数 public void retry () { log.info("retry start"); throw new RetryException("retry fail"); @Recover public void recover (RetryException e) { log.info("recovery,{}",e.getMessage()); * @author hsw * @Date 17:34 2018/7/23 @RunWith(SpringRunner.class) @SpringBootTest public class RecoryTestTest { @Autowired private RecoryTest recoryTest; @Test public void retry() { recoryTest.retry(); @Test public void test() { recoryTest.test();
RecoryTest为demo实现类。
RecoryTestTest为测试类。

项目基于springboot,@EnableRetry注解可以添加在项目启动类上,也可以直接添加在具有@Retryable注解方法的类上。

通过在指定方法前添加@Retryable注解来实现重试。

@Retryable(value = {RetryException.class},//指定发生的异常进行重试
            maxAttempts=3,                   //重试次数,默认即为3
            backoff = @Backoff(value = 2000))//每次重试延迟毫秒数
    public void retry () {
        log.info("retry start");
        throw new RetryException("retry fail");

被注解的方法发生异常时会重试 

@Retryable

  • value:指定发生的异常进行重试 
  • include:和value一样,默认空,当exclude也为空时,所有异常都重试 
  • exclude:指定异常不重试,默认空,当include也为空时,所有异常都重试 
  • maxAttemps:重试次数,默认3 
  • backoff:重试补偿机制,默认没有

@Backoff注解

  • delay:指定延迟后重试 
  • multiplier:指定延迟的倍数,比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒

@Recover 

当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调。

@Recover
    public void recover (RetryException e) {
        log.info("recovery,{}",e.getMessage());

调用测试类的retry方法后执行结果如下:

调用test方法却无法得到预期结果,这是因为retry用到了aspect增强,在方法内部调用的时候,会使aspect增强失效,那么retry当然也会失效。

本文参考多篇博文,仅供学习记录使用。

Retryable-Retrofit TODO: A way to retry many failed Retrofit calls. Useful in combination with listening to connectivity changes on Android. Download Download the latest JAR or grab via Maven: com.nightlynexus.retryable-retrofit retryable 0.1.0 or Gradle: compile 'com.nightlynexus.retryable-retrofit:retryable:0.1.0' TODO: Snapshots of the development version are available in Sonatype's snapshots repository. Usage RetryableCalls retryableCalls = new RetryableCalls(); Retrofit retrofi 如上图中的代码所示,我们通过@Retryable注解,对RemoteAccessException异常进行重试,重试次数为2次,第一次重试间隔为5s,之后重试的时间间隔为前一次的2倍,第二次重试间隔10s,第三次重试间隔20s。有两种组合方式,乐观组合重试策略是指只要有一个策略允许重试即可以,悲观组合重试策略是指只要有一个策略不允许重试即不可以。另外@Retryable和@Recover修饰的方法要在同一个类中,且被@Retryable 标记的方法不能有返回值,这样Recover方法才会生效。 在调用第三方接口或者使用MQ时,会出现网络抖动,连接超时等网络异常,所以需要重试。为了使处理更加健壮并且不太容易出现故障,后续的尝试操作,有时候会帮助失败的操作最后执行成功。一般情况下,需要我们自行实现重试机制,一般是在业务代码中加入一层循环,如果失败后,再尝试重试,但是这样实现并不优雅。在SpringBoot中,已经实现了相关的能力,通过@Retryable注解可以实现我们想要的结果。 Retryable和@Recover是Spring Framework中的注解,用于支持在方法执行期间发生异常时的重试和恢复操作。@Retryable注解用于标记方法,在方法执行期间发生异常时进行重试。重试行为可以使用Spring Retry框架提供的默认策略或自定义策略来定义。您可以指定要重试的异常类型以及最大重试次数和重试间隔等参数。@Recover注解用于标记一个恢复方法,在最终重试失败后执行该方法。恢复方法应具有与原始方法相同的参数和返回类型,并且应在同一类中声明。 第一章 @Async注解. 文章目录前言一、@Async是什么?二、使用步骤1.启用@Async2.在方法上添加@Async3.带返回值方法实现异步4.线程池5. 注意事项总结 在平时的项目开发中大家应该遇到过下面类似的场景: 在用户注册通过的同时给用户发短信。 批量推送消息给用户。 凌晨系统自动化统计数据。 大家先想几个问题: 在用户注册的这个接口中,发送短信的逻辑是否应该占用用户注册的时间? 当用户量很大时,如何快速推送? 当统计的数据量很大,统计的指标很多,如何加快定时器统计效率? public class DatasyncApplication { public static void main(String[] args) { SpringApplication.r... SpringRetry(spring的自动重试机制),SpringRetry是基于AOP实现的,在应用程序中,由于一些网络等不可预知的问题,我们的程序或者接口会失败,比如调用一个第三方的接口获取数据失败了,这时就需要重试机制,比如延时3S后重试、间隔不断增加重试等。都可以使用SpringRetry来实现。 &lt;dependency&gt; &lt;groupId&gt;org.springframework.retry&lt;/groupId&gt; &lt;artifactId&gt;spring-retry&lt;/artifactId&gt; &lt;version&gt;1.1.2.RELEASE&lt;/version&gt; &lt;/d 什么时候需要重处理? 在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败,调用远程服务失败,争抢锁失败,等等,这些错误可能是因为网络波动造成的,等待过后重处理就能成功.通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码.然而spring-retry却可以通过注解...