关闭

Spring重试支持Spring Retry

标签: RetryableRecoverspringretry
9972人阅读 评论(10) 收藏 举报
分类:

第一步、引入maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.1.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.6</version>
</dependency>

第二步、添加@Retryable和@Recover注解

package hello;

import org.springframework.remoting.RemoteAccessException;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
public class RemoteService {
@Retryable(value= {RemoteAccessException.class},maxAttempts = 3,backoff = @Backoff(delay = 5000l,multiplier = 1))
public void call() throws Exception {
        System.out.println("do something...");
        throw new RemoteAccessException("RPC调用异常");
}
@Recover
public void recover(RemoteAccessException e) {
        System.out.println(e.getMessage());
}
}

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

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

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

第三步、SpringBoot方式启动容器、测试

添加@EnableRetry注解,启用重试功能

package hello;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.retry.annotation.EnableRetry;

@SpringBootApplication
@EnableRetry
public class Application {

    public static void main(String[] args) throws Exception {
        ApplicationContext annotationContext = new AnnotationConfigApplicationContext("hello");
        RemoteService remoteService = annotationContext.getBean("remoteService", RemoteService.class);
        remoteService.call();
    }
}

运行结果:
16:50:51.012 [main] DEBUG org.springframework.retry.support.RetryTemplate - Retry: count=0
do something…
16:50:51.025 [main] DEBUG org.springframework.retry.backoff.ExponentialBackOffPolicy - Sleeping for 5000
16:50:56.026 [main] DEBUG org.springframework.retry.support.RetryTemplate - Checking for rethrow: count=1
16:50:56.026 [main] DEBUG org.springframework.retry.support.RetryTemplate - Retry: count=1
do something…
16:50:56.026 [main] DEBUG org.springframework.retry.backoff.ExponentialBackOffPolicy - Sleeping for 5000
16:51:01.026 [main] DEBUG org.springframework.retry.support.RetryTemplate - Checking for rethrow: count=2
16:51:01.027 [main] DEBUG org.springframework.retry.support.RetryTemplate - Retry: count=2
do something…
16:51:01.027 [main] DEBUG org.springframework.retry.support.RetryTemplate - Checking for rethrow: count=3
16:51:01.027 [main] DEBUG org.springframework.retry.support.RetryTemplate - Retry failed last attempt: count=3
RPC调用异常

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

补充
对于非幂等的请求(比如新增,更新操作),千万不要使用重试,对数据一致性会造成很大影响。另外对Spring Retry实现原理感兴趣的可以看下这篇博客

4
1
查看评论

重试框架Spring retry实践

spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断。对于重试室友场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如du...
  • u011116672
  • u011116672
  • 2017-09-03 17:16
  • 2234

使用Spring-retry 1.1.4完成重试功能

前言在实际项目中,经常需要在某种情况下对调用的方法进行重试,例如发生超时。而通过Spring-retry则能简化重试功能的实现,并实现更多样的重试操作。Spring-retry结构Spring-retry提供的RetryOperations接口,该接口提供了若干方法来执行重试操作。在Spring-r...
  • Revivedsun
  • Revivedsun
  • 2016-11-29 22:30
  • 5376

spring-retry

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

Spring Retry实现原理

在前面这篇博客中介绍了Spring Retry的使用,本文通过一个简单的例子演示Spring Retry的实现原理,例子中定义的注解只包含重试次数属性,实际上Spring Retry中注解可设置属性要多的多,单纯为了讲解原理,所以弄简单点,关于Spring Retry可查阅相关文档、博客。 ...
  • JIESA
  • JIESA
  • 2017-08-17 19:04
  • 428

Spring Retry实现原理

在前面这篇博客中介绍了Spring Retry的使用,本文通过一个简单的例子演示Spring Retry的实现原理,例子中定义的注解只包含重试次数属性,实际上Spring Retry中注解可设置属性要多的多,单纯为了讲解原理,所以弄简单点,关于Spring Retry可查阅相关文档、博客。 注...
  • u014513883
  • u014513883
  • 2016-09-30 17:44
  • 5147

springboot(十四)使用spring retry

springboot Retry
  • u011493599
  • u011493599
  • 2017-04-14 15:28
  • 2091

spring-retry jar

  • 2014-07-30 13:39
  • 79KB
  • 下载

spring-retry简单例子

java简单的重试代码 import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; public class retry { public static v...
  • u010081710
  • u010081710
  • 2017-09-07 12:43
  • 200

spring的重试机制无效@Retryable@EnableRetry

spring-retry模块支持方法和类、接口、枚举级别的重试方式很简单,引入pom包<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo...
  • xsgnzb
  • xsgnzb
  • 2017-12-12 12:11
  • 229

Retry重试机制

业务场景     应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作。这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果;第二步拿到第一步结果或者捕捉异常,如果出现错误或异常实现重试上传逻辑...
  • paul_wei2008
  • paul_wei2008
  • 2016-12-25 18:53
  • 6328
    个人资料
    • 访问:71709次
    • 积分:1080
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:2篇
    • 译文:0篇
    • 评论:26条
    友情链接
    文章分类
    最新评论