返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot利用@Retryable注解实现接口重试
  • 315
分享到

SpringBoot利用@Retryable注解实现接口重试

2024-04-02 19:04:59 315人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言1.@Retryable是什么2.使用步骤(1) POM依赖(2)启用@Retryable(3)在方法上添加@Retryable(4)@Recover(5)注意事项3.总结前

前言

在实际工作中,重处理是一个非常常见的场景,比如:

  • 发送消息失败。
  • 调用远程服务失败。
  • 争抢失败。

这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while​循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。

1.@Retryable是什么

spring系列的spring-retry​是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释的。

2.使用步骤

(1) POM依赖

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

(2)启用@Retryable

@EnableRetry
@SpringBootApplication
public class HelloApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }

}

(3)在方法上添加@Retryable

import com.mail.elegant.service.TestRetryService;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import java.time.LocalTime;
 
@Service
public class TestRetryServiceImpl implements TestRetryService {
 
    @Override
    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public int test(int code) throws Exception{
        System.out.println("test被调用,时间:"+LocalTime.now());
          if (code==0){
              throw new Exception("情况不对头!");
          }
        System.out.println("test被调用,情况对头了!");
 
        return 200;
    }
}

来简单解释一下注解中几个参数的含义:

  • value:抛出指定异常才会重试。
  • include:和value一样,默认为空,当exclude也为空时,默认所有异常。
  • exclude:指定不处理的异常。
  • maxAttempts:最大重试次数,默认3次。
  • backoff​:重试等待策略,默认使用@Backoff,@Backoff​的value默认为1000L,我们设置为2000L;multiplier​(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

当重试耗尽时还是失败,会出现什么情况呢

当重试耗尽时,RetryOperations​可以将控制传递给另一个回调,即RecoveryCallback。Spring-Retry​还提供了@Recover注解,用于@Retryable重试失败后处理方法。如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。

(4)@Recover

@Recover
public int recover(Exception e, int code){
   System.out.println("回调方法执行!!!!");
   //记日志数据库 或者调用其余的方法
    return 400;
}

可以看到传参里面写的是 Exception e​,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e​通知触发这个回调方法)。对于@Recover注解的方法,需要特别注意的是:

  • 方法的返回值必须与@Retryable方法一致。
  • 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable​配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)。
  • 该回调方法与重试方法写在同一个实现类里面。
  • 复java面试,获取最新面试题资料。

(5)注意事项

  • 由于是基于aop实现,所以不支持类里自调用方法。
  • 如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void。
  • 方法内不能使用try catch,只能往外抛异常。
  • @Recover​注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

3.总结

本篇主要简单介绍了Springboot中的Retryable的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的。

到此这篇关于SpringBoot利用@Retryable注解实现接口重试的文章就介绍到这了,更多相关SpringBoot @Retryable接口重试内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot利用@Retryable注解实现接口重试

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

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

猜你喜欢
  • SpringBoot利用@Retryable注解实现接口重试
    目录前言1.@Retryable是什么2.使用步骤(1) POM依赖(2)启用@Retryable(3)在方法上添加@Retryable(4)@Recover(5)注意事项3.总结前...
    99+
    2024-04-02
  • springboot整合@Retryable实现重试功能的示例代码
    目录前言@Retryable 简介使用步骤1.引入依赖2.启用@Retryable3.添加@Retryable注解4.测试注意事项最后结语前言 在实际工作中,重试机制是一个很常见的场...
    99+
    2024-04-02
  • SpringBoot整合spring-retry实现接口请求重试机制及注意事项
    目录一、重试机制二、重试机制要素三、重试机制注意事项四、SpringBoot整合spring-retry1)添加依赖2)添加@EnableRetry注解3)添加@Retryable注...
    99+
    2024-04-02
  • springboot怎么利用aop实现接口异步
    小编给大家分享一下springboot怎么利用aop实现接口异步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、前言在项目中发现有接口(excel导入数据)处理数据需要耗时比较长的时间,是因为数据量比较大,同时数据的校验...
    99+
    2023-06-22
  • Springboot利用Redis实现接口幂等性拦截
    目录前言正文实战开始核心三件套工具类三件套REDIS配置类前言 近期一个老项目出现了接口幂等性 校验问题,前端加了按钮置灰, 依然被人拉着接口参数一顿输出,还是重复调用了接口,小陈及...
    99+
    2024-04-02
  • 详解Springboot如何通过注解实现接口防刷
    目录前言1、实现防刷切面PreventAop.java1.1 定义注解Prevent1.2 实现防刷切面PreventAop2、使用防刷切面3、演示前言 本文介绍一种极简洁、灵活通用...
    99+
    2024-04-02
  • SpringBoot如何使用自定义注解实现接口限流
    目录使用自定义注解实现接口限流1、自定义限流注解2、限流类型枚举类3、限流 Lua 脚本4、限流切面处理类 5、使用与测试SpringBoot工程中限流方式1、google...
    99+
    2024-04-02
  • Guava Retryer实现接口重试的示例
    目录前言 Guava Retryer 引入依赖 快速开始 指数退避(Exponential Backoff) 斐波那契退避(Fibonacci Backoff) 重试监听器 小结 前...
    99+
    2024-04-02
  • 使用注解怎么实现一个SpringBoot 接口防刷功能
    这篇文章将为大家详细讲解有关使用注解怎么实现一个SpringBoot 接口防刷功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。项目结构如下:一、编写注解类 AccessLimitpacka...
    99+
    2023-06-06
  • SpringBoot中怎么利用Sentinel实现接口流量控制
    这期内容当中小编将会给大家带来有关SpringBoot中怎么利用Sentinel实现接口流量控制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。项目搭建首先我们来创建一个测试项目,这里初始化项目的url建议...
    99+
    2023-06-15
  • Springboot怎么利用Redis实现接口幂等性拦截
    今天小编给大家分享一下Springboot怎么利用Redis实现接口幂等性拦截的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-07-02
  • SpringBoot基于redis自定义注解实现后端接口防重复提交校验
    目录一、添加依赖二、代码实现三、测试一、添加依赖 <dependency> <groupId>org.springfr...
    99+
    2024-04-02
  • SpringBoot利用注解来实现Redis分布式锁
    目录一、业务背景二、分析流程加锁超时问题解决方案:增加一个「续时」三、设计方案四、实操相关属性类配置核心切面拦截的操作五、开始测试六、总结一、业务背景 有些业务请求,属于耗时操作,需...
    99+
    2024-04-02
  • springboot中shiro使用自定义注解屏蔽接口鉴权实现
    目录传统做法使用自定义注解屏蔽接口鉴权拓展内容:关于spring中的派生注解传统做法 spring boot整合shiro后,如果某些接口需要屏蔽鉴权的话(比如登录)接口,我们一般会...
    99+
    2024-04-02
  • SpringBoot使用@Autowired为多实现的接口注入依赖
    目录使用@Autowired为多实现的接口注入依赖问题描述方法一:使用@Qualifier限定方法二:利用@Autowired可以byName匹配Bean的特性方法三:使用@Prim...
    99+
    2024-04-02
  • springboot接口多实现类选择性注入解决方案
    目录一、问题的描述二、相对低级解决方案2.1. 方案一:使用@Primary注解2.2. 方案二:使用@Resource注解2.3.方案三:使用@Qualifier注解三、相对高级的...
    99+
    2024-04-02
  • 利用Redis实现防止接口重复提交功能
    目录前言1、自定义注解2、自定义拦截器3、Redis工具类4、其他想说的前言 在划水摸鱼之际,突然听到有的用户反映增加了多条一样的数据,这用户立马就不干了,让我们要马上修复,不然就要...
    99+
    2024-04-02
  • SpringBoot利用自定义注解实现多数据源
    目录前置学习数据准备行动起来前置学习 需要了解 注解、Aop、SpringBoot整合Mybatis的使用。 数据准备 基础项目代码:https://gitee.com/J_look...
    99+
    2022-11-13
    SpringBoot 自定义注解 多数据源 SpringBoot多数据源
  • SpringBootRedis用注释实现接口限流详解
    目录1. 准备工作2. 限流注解3. 定制 RedisTemplate4. 开发 Lua 脚本5. 注解解析6. 接口测试7. 全局异常处理1. 准备工作 首先我们创建一个 Spri...
    99+
    2024-04-02
  • SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码
    目录为什么要限流限流背景实现限流1、引入依赖2、自定义限流注解3、限流切面4、写一个简单的接口进行测试5、全局异常拦截6、接口测试为什么要限流 系统在设计的时候,我们会有一个系统的预...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作