返回顶部
首页 > 资讯 > 精选 >Spring Retry重试框架如何使用
  • 244
分享到

Spring Retry重试框架如何使用

2023-07-04 12:07:48 244人浏览 安东尼
摘要

这篇“spring Retry重试框架如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring 

这篇“spring Retry重试框架如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Retry重试框架如何使用”文章吧。

首先引入依赖

<dependency>    <groupId>org.springframework.retry</groupId>    <artifactId>spring-retry</artifactId>    <version>1.3.4</version></dependency><dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjweaver</artifactId>    <version>1.9.9.1</version></dependency>

使用方式有两种:命令式和声明式

命令式

@GetMapping("/hello")public String hello(@RequestParam("code") Integer code) throws Throwable {    RetryTemplate retryTemplate = RetryTemplate.builder()            .maxAttempts(3)            .fixedBackoff(1000)            .retryOn(RemoteAccessException.class)            .build();    retryTemplate.reGISterListener(new MyRetryListener());    String resp = retryTemplate.execute(new RetryCallback<String, Throwable>() {        @Override        public String doWithRetry(RetryContext context) throws Throwable {            return helloService.hello(code);        }    });    return resp;}

定义一个RetryTemplate,然后调用execute方法,可配置项比较多,不一一列举

真正使用的时候RetryTemplate可以定义成一个Bean,例如:

@Configurationpublic class RetryConfig {    @Bean    public RetryTemplate retryTemplate() {        RetryTemplate retryTemplate = RetryTemplate.builder()                .maxAttempts(3)                .fixedBackoff(1000)                .withListener(new MyRetryListener())                .retryOn(RemoteAccessException.class)                .build();        return retryTemplate;    }}

业务代码:

@Overridepublic String hello(int code) {    if (0 == code) {        System.out.println("出错了");        throw new RemoteAccessException("出错了");    }    System.out.println("处理完成");    return "ok";}

Spring Retry重试框架如何使用

Spring Retry重试框架如何使用

Spring Retry重试框架如何使用

监听器实现:

package com.example.retry.listener;import org.springframework.retry.RetryCallback;import org.springframework.retry.RetryContext;import org.springframework.retry.RetryListener;public class MyRetryListener implements RetryListener {    @Override    public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {        System.out.println("open");        return true;    }    @Override    public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {        System.out.println("close");    }    @Override    public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {        System.out.println("error");    }}

声明式(注解方式)

@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(value = 1000, delay = 2000, multiplier = 0.5))@Overridepublic String hi(int code) {    System.out.println("方法被调用");    int a = 1/code;    return "ok";}@Recoverpublic String hiRecover(Exception ex, int code) {    System.out.println("重试结束");    return "asdf";}

这里需要主要的几点

  • @EnableRetry(proxyTargetClass = true/false)

  • @Retryable 修饰的方法必须是public的,而且不能是同一个类中调用

  • @Recover 修饰的方法签名必须与@Retryable修饰的方法一样,除了第一个参数外

@GetMapping("/hi")public String hi(@RequestParam("code") Integer code) {    return helloService.hi(code);}

Spring Retry重试框架如何使用

Spring Retry重试框架如何使用

Spring Retry重试框架如何使用

Spring Retry重试框架如何使用

1. 用法

声明式

@Configuration@EnableRetrypublic class Application {}@Serviceclass Service {    @Retryable(RemoteAccessException.class)    public void service() {        // ... do something    }    @Recover    public void recover(RemoteAccessException e) {       // ... panic    }}

命令式

RetryTemplate template = RetryTemplate.builder().maxAttempts(3).fixedBackoff(1000).retryOn(RemoteAccessException.class).build();template.execute(ctx -> {    // ... do something});

2. RetryTemplate

为了自动重试,Spring Retry 提供了 RetryOperations 重试操作策略

public interface RetryOperations {    <T> T execute(RetryCallback<T> retryCallback) throws Exception;    <T> T execute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback)        throws Exception;    <T> T execute(RetryCallback<T> retryCallback, RetryState retryState)        throws Exception, ExhaustedRetryException;    <T> T execute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback,        RetryState retryState) throws Exception;}

基本回调是一个简单的接口,允许插入一些要重试的业务逻辑:

public interface RetryCallback<T> {    T doWithRetry(RetryContext context) throws Throwable;}

回调函数被尝试,如果失败(通过抛出异常),它将被重试,直到成功或实现决定中止。

RetryOperations最简单的通用实现是RetryTemplate

RetryTemplate template = new RetryTemplate();TimeoutRetryPolicy policy = new TimeoutRetryPolicy();policy.setTimeout(30000L);template.setRetryPolicy(policy);Foo result = template.execute(new RetryCallback<Foo>() {    public Foo doWithRetry(RetryContext context) {        // Do stuff that might fail, e.g. WEBservice operation        return result;    }});

从Spring Retry 1.3开始,RetryTemplate支持流式配置:

RetryTemplate.builder()      .maxAttempts(10)      .exponentialBackoff(100, 2, 10000)      .retryOn(IOException.class)      .traversinGCauses()      .build();RetryTemplate.builder()      .fixedBackoff(10)      .withinMillis(3000)      .build();RetryTemplate.builder()      .infiniteRetry()      .retryOn(IOException.class)      .unifORMRandomBackoff(1000, 3000)      .build();

3. RecoveryCallback

当重试耗尽时,RetryOperations可以将控制传递给不同的回调:RecoveryCallback。

Foo foo = template.execute(new RetryCallback<Foo>() {    public Foo doWithRetry(RetryContext context) {        // business logic here    },  new RecoveryCallback<Foo>() {    Foo recover(RetryContext context) throws Exception {          // recover logic here    }});

4. Listeners

public interface RetryListener {    void open(RetryContext context, RetryCallback<T> callback);    void onSuccess(RetryContext context, T result);    void onError(RetryContext context, RetryCallback<T> callback, Throwable e);    void close(RetryContext context, RetryCallback<T> callback, Throwable e);}

在最简单的情况下,open和close回调在整个重试之前和之后,onSuccess和onError应用于个别的RetryCallback调用,onSuccess方法在成功调用回调之后被调用。

5. 声明式重试

有时,你希望在每次业务处理发生时都重试一些业务处理。这方面的典型例子是远程服务调用。Spring Retry提供了一个aop拦截器,它将方法调用封装在RetryOperations实例中。RetryOperationsInterceptor执行被拦截的方法,并根据提供的RepeatTemplate中的RetryPolicy在失败时重试。

你可以在 @Configuration 类上添加一个 @EnableRetry 注解,并且在你想要进行重试的方法(或者类)上添加 @Retryable 注解,还可以指定任意数量的重试监听器。

@Configuration@EnableRetrypublic class Application {    @Bean    public Service service() {        return new Service();    }    @Bean public RetryListener retryListener1() {        return new RetryListener() {...}    }    @Bean public RetryListener retryListener2() {        return new RetryListener() {...}    }}@Serviceclass Service {    @Retryable(RemoteAccessException.class)    public service() {        // ... do something    }}

可以使用 @Retryable 的属性类控制 RetryPolicy 和 BackoffPolicy

@Serviceclass Service {    @Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))    public service() {        // ... do something    }}

如果希望在重试用尽时采用替代代码返回,则可以提供恢复方法。方法应该声明在与@Retryable实例相同的类中,并标记为@Recover。返回类型必须匹配@Retryable方法。恢复方法的参数可以包括抛出的异常和(可选地)传递给原始可重试方法的参数(或者它们的部分列表,只要在需要的最后一个之前不省略任何参数)。

@Serviceclass Service {    @Retryable(RemoteAccessException.class)    public void service(String str1, String str2) {        // ... do something    }    @Recover    public void recover(RemoteAccessException e, String str1, String str2) {       // ... error handling making use of original args if required    }}

若要解决可选择用于恢复的多个方法之间的冲突,可以显式指定恢复方法名称。

@Serviceclass Service {    @Retryable(recover = "service1Recover", value = RemoteAccessException.class)    public void service1(String str1, String str2) {        // ... do something    }    @Retryable(recover = "service2Recover", value = RemoteAccessException.class)    public void service2(String str1, String str2) {        // ... do something    }    @Recover    public void service1Recover(RemoteAccessException e, String str1, String str2) {        // ... error handling making use of original args if required    }    @Recover    public void service2Recover(RemoteAccessException e, String str1, String str2) {        // ... error handling making use of original args if required    }}

以上就是关于“Spring Retry重试框架如何使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Spring Retry重试框架如何使用

本文链接: https://lsjlt.com/news/344878.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Retry重试框架如何使用
    这篇“Spring Retry重试框架如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-07-04
  • Spring Retry重试框架的使用讲解
    目录命令式声明式(注解方式)1. 用法2. RetryTemplate3. RecoveryCallback4. Listeners5. 声明式重试重试的使用场景比较多,比如调用远程...
    99+
    2022-11-13
    Spring Retry重试 Spring Retry
  • Spring Boot中怎么使用Spring-Retry重试框架
    这篇文章主要介绍“Spring Boot中怎么使用Spring-Retry重试框架”,在日常操作中,相信很多人在Spring Boot中怎么使用Spring-Retry重试框架问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-06-30
  • Spring Boot中怎么使用Spring Retry重试框架
    今天小编给大家分享一下Spring Boot中怎么使用Spring Retry重试框架的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获...
    99+
    2023-06-30
  • SpringBoot中使用Spring-Retry重试框架的实现
    目录Maven依赖注解使用开启Retry功能注解@Retryable注解@Recover注解@CircuitBreakerRetryTemplateRetryTemplate配置使用...
    99+
    2024-04-02
  • Spring Boot中使用Spring Retry重试框架的操作方法
    目录Spring Retry 在SpringBoot 中的应用Maven依赖注解使用开启Retry功能注解@Retryable注解@Recover注解@CircuitBreakerR...
    99+
    2024-04-02
  • Spring Retry重试怎么使用
    本篇内容介绍了“Spring Retry重试怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring-retry是什么?...
    99+
    2023-07-04
  • 【SpringBoot】75、SpringBoot中使用spring-retry轻松解决重试
    在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为了更加健壮并且更不容易出...
    99+
    2023-09-29
    spring boot java retry 重试 aop
  • spring retry实现方法请求重试的使用步骤
    目录1 spring-retry是什么?2 使用步骤2.1 引入maven库2.2 在spring启动类上开启重试功能2.3 公共业务代码2.4 传统的重试做法2.5 使用sprin...
    99+
    2024-04-02
  • 如何使用Spring-Test对Spring框架进行单元测试
    目录Spring-Test对Spring框架进行单元测试加载依赖编写SpringTestBase基础类,加载所需xml文件编写单元测试类 示例Spring-Test测试数据1、新建一...
    99+
    2024-04-02
  • Spring security框架如何使用
    本篇内容介绍了“Spring security框架如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介Spring Secu...
    99+
    2023-07-05
  • 使用Spring-Retry解决SpringBoot应用程序中的重试问题
    目录1、背景2、引入依赖3、开启spring-retry4、在方法上添加@Retryable5、重试完6、注意事项1、背景 在日常开发过程中,难免会与第三方接口发生交互,例如:远程服...
    99+
    2023-05-16
    Spring-Retry解决重试 SpringBoot重试问题
  • 怎么用spring retry方法调用失败重试机制
    这篇文章主要介绍“怎么用spring retry方法调用失败重试机制”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用spring retry方法调用失败重试机制”文章能帮助大...
    99+
    2023-06-29
  • SpringRetry重试框架的具体使用
    目录一、环境搭建二、RetryTemplate2.1 RetryTemplate2.2 RetryListener2.3 回退策略2.3.1 FixedBackOffPolicy2....
    99+
    2024-04-02
  • SpringRetry重试框架的使用讲解
    目录重试框架Spring-Retry是什么Spring-Retry如何使用测试属性说明重试全部失败的回调方法重试框架Spring-Retry是什么 Spring Retry是一个在S...
    99+
    2023-01-06
    Spring Retry Spring Retry重试 Spring Retry重试框架
  • Spring如何使用Validation验证框架
    这篇文章主要介绍了Spring如何使用Validation验证框架,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、介绍Spring Validation 验证框架对参数的验...
    99+
    2023-06-20
  • Spring框架如何使用二维码?
    随着移动互联网的快速发展,二维码已经成为了一种非常流行的信息识别方式。在很多场景下,我们都可以看到二维码的身影,比如在超市、商场、地铁站等公共场所,我们可以通过扫描二维码获取更多的信息或者完成一些交易操作。在这篇文章中,我们将介绍如何在S...
    99+
    2023-10-21
    二维码 spring leetcode
  • 如何在Spring框架中使用NumPy?
    Spring框架是一个非常流行的Java开发框架,而NumPy则是一个Python科学计算库。虽然它们似乎没有直接的关系,但是在某些情况下,我们可能需要在Spring框架中使用NumPy。本文将介绍如何在Spring框架中使用NumPy,...
    99+
    2023-07-30
    spring numpy npm
  • Spring框架中如何使用PHP接口进行重定向?
    在Web开发中,重定向是一个非常常见的操作。它可以让用户在不同的网页之间进行跳转,同时也可以帮助我们实现一些特定的业务需求。在Spring框架中,我们可以使用PHP接口来实现重定向操作。接下来,本文将为大家介绍Spring框架中如何使用P...
    99+
    2023-06-18
    接口 重定向 spring
  • Spring框架中一个有用的小组件之Spring Retry组件详解
    1、概述 Spring Retry 是Spring框架中的一个组件, 它提供了自动重新调用失败操作的能力。这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助。 在本文中,我们...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作