Spring Boot集成 Spring Retry 实现容错重试机制并附源码

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot集成 Spring Retry 实现容错重试机制

  • 1、前言
  • 2、什么是 Spring Retry?
  • 3、开始简单集成
  • 4、Spring Retry的高级配置
    • ❶ 自定义重试策略
      • canRetry方法的介绍
      • open方法的介绍
      • close方法的介绍
      • registerThrowable方法的介绍
    • ❷ 使用 RetryTemplate
  • 5、代码汇总
  • 6、总结

1、前言

本文对应源码下载地址: https://download.csdn.net/download/lhmyy521125/89430153 无需积分

在日常开发过程中,我们经常会与第三方接口进行交互,例如:短信发送远程服务调用争抢锁等场景,当正常调用发生异常时,例如:网络延迟服务宕机临时故障等问题,会导致本次请求交互失败,而借助 Spring Retry 能够帮助我们在方法调用失败时自动重试,从而提高系统的稳定性和健壮性。

本文跟着博主由浅入深一起来学习 Spring Retry
在这里插入图片描述

2、什么是 Spring Retry?

Spring Retry 是一个用于简化 Java 方法重试逻辑的库,它能够在方法调用失败时自动重试,并提供了丰富的配置选项,支持重试次数、重试间隔时间、异常类型等配置。通过使用 Spring Retry,可以方便地在 Spring Boot 应用中实现容错和重试机制。

Spring Retry 的特性

  • 自动重试:当方法调用失败时,根据配置的重试策略自动重试
  • 支持多种异常类型:可以配置在遇到特定异常时重试,如 IOExceptionSQLException
  • 重试间隔控制:支持配置重试间隔时间,可以设置固定间隔或指数增长间隔
  • 自定义重试策略:提供了灵活的重试策略接口,可以实现自定义的重试逻辑

3、开始简单集成

构建你的 Spring Boot 项目,在pom.xml中引入依赖

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

配置 Spring Retry 可以通过注解或配置文件进行配置。下面展示如何使用注解方式配置

使用@EnableRetry注解开启
在主类 或对应配置类上加@EnableRetry注解,表示启用重试机制

@SpringBootApplication
@EnableRetry
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

使用 @Retryable 注解
@Retryable 注解是 Spring Retry 的核心注解,用于标记需要重试的方法。示例代码如下:

import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;@Service
public class RetryService {//初始化重试次数private int attempt = 0;@Retryable(value = {RuntimeException.class}, maxAttempts = 5, backoff = @Backoff(delay = 2000))public String retryMethod() {attempt++;System.out.println("重试次数Attempt: " + attempt);if (attempt < 3) {throw new RuntimeException("出现故障, 重试中...");}return "Success!";}
}

配置参数说明
value 指定了需要重试的异常类型,这里是 RuntimeException
maxAttempts 设置了最大重试次数,这里是 5 次
backoff 设置了重试间隔,使用 @Backoff 注解指定延迟时间,单位是毫秒,这里是 2000 毫秒(2秒)

创建一个controller,用于调用重试方法,并测试重试逻辑:

import com.example.demo.service.RetryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class RetryController {@Autowiredprivate RetryService retryService;@GetMapping("/retry")public String retry() {try {return retryService.retryMethod();} catch (Exception e) {return "重试失败: " + e.getMessage();}}
}

接口请求测试
在这里插入图片描述

观察控制台
在这里插入图片描述
测试你会发现接口请求过程中,控制台一直输出了三次重试次数后成功返回,你以为Spring Retry 就这么点东西?我们继续往下看

4、Spring Retry的高级配置

❶ 自定义重试策略

在某些情况下,默认的重试策略可能无法满足需求,这时可以通过实现 RetryPolicy 接口来自定义重试策略,控制重试的逻辑和条件

import org.springframework.retry.RetryContext;
import org.springframework.retry.RetryPolicy;public class CustomRetryPolicy implements RetryPolicy {private static final int MAX_RETRIES = 3;@Overridepublic boolean canRetry(RetryContext context) {// 检查重试次数int retryCount = context.getRetryCount();if (retryCount >= MAX_RETRIES) {return false; // 如果重试次数达到最大值,不再重试}// 检查异常类型Throwable lastException = context.getLastThrowable();if (lastException instanceof MyCustomException) {// 如果是我们关心的特定异常类型,允许重试return true;}// 其他情况下不允许重试return false;}//MyCustomException 是你定义的异常类型public class MyCustomException extends Exception { /* ... */ }//在重试操作开始时创建新的上下文对象,用于存储重试信息@Overridepublic RetryContext open(RetryContext retryContext) {return null;}//在重试操作结束时执行清理或记录操作@Overridepublic void close(RetryContext retryContext) {}//在重试过程中遇到异常时记录异常信息@Overridepublic void registerThrowable(RetryContext retryContext, Throwable throwable) {}
}

canRetry方法的介绍

boolean canRetry(RetryContext context);

canRetry 方法是重试策略的核心逻辑,通过检查当前的重试上下文信息,决定是否可以继续进行重试。通常会根据重试次数、异常类型等条件来判断是否继续重试

作用:判断是否应该继续进行重试操作
参数:RetryContext context,表示当前的重试上下文,包含了重试次数、上次异常等信息
返回值:boolean,返回 true 表示可以继续重试,返回 false 表示停止重试

open方法的介绍

RetryContext open(RetryContext parent);

在重试操作开始时,Spring Retry 会调用 open 方法创建一个新的 RetryContext,这个上下文对象会在整个重试过程中传递,用于存储重试相关的信息

作用:创建并返回一个新的 RetryContext 对象,表示一次新的重试操作的上下文信息
参数:RetryContext parent,表示父级上下文,如果没有父级上下文则为 null
返回值:RetryContext,表示新的重试上下文

close方法的介绍

当重试操作完成后,无论是否成功,Spring Retry 都会调用 close 方法,可以在这个方法中执行一些清理操作或记录日志

void close(RetryContext context);

作用:在重试操作完成时(无论成功或失败)调用,用于清理或记录重试操作的结束
参数:RetryContext context,表示当前的重试上下文

registerThrowable方法的介绍

void registerThrowable(RetryContext context, Throwable throwable);

在重试过程中,如果遇到异常,Spring Retry 会调用 registerThrowable 方法,将异常信息记录到 RetryContext 中。这个信息可以在后续的重试操作中使用

作用:在重试过程中遇到异常时调用,用于记录当前的异常信息
参数:RetryContext context,表示当前的重试上下文
参数:Throwable throwable,表示当前遇到的异常

Spring配置中使用自定义 RetryPolicy ,同时也可以配置定制 RetryTemplate

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.backoff.FixedBackOffPolicy;
import org.springframework.retry.support.RetryTemplate;@Configuration
public class RetryConfig {@Beanpublic RetryTemplate retryTemplate() {RetryTemplate retryTemplate = new RetryTemplate();// 设置自定义的RetryPolicyCustomRetryPolicy retryPolicy = new CustomRetryPolicy(5);// 还可以设置其他的策略,如BackoffPolicy等  FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();backOffPolicy.setBackOffPeriod(2000);retryTemplate.setRetryPolicy(retryPolicy);retryTemplate.setBackOffPolicy(backOffPolicy);return retryTemplate;}
}

❷ 使用 RetryTemplate

RetryTemplateSpring Retry 提供的一个模板类,允许我们更细粒度地控制重试逻辑。下面是使用 RetryTemplate 的例子

import org.springframework.retry.support.RetryTemplate;
import org.springframework.stereotype.Service;@Service
public class TemplateRetryService {private final RetryTemplate retryTemplate;public TemplateRetryService(RetryTemplate retryTemplate) {this.retryTemplate = retryTemplate;}public String executeWithRetry() {return retryTemplate.execute(context -> {System.out.println("TemplateRetryService执行重试..");if (Math.random() < 0.7) {throw new RuntimeException("重试失败");}return "Success!";});}
}

5、代码汇总

Spring Retry 也是可以与 Spring AOP 配合使用,通过切面拦截方法调用,实现全局的重试逻辑,只需要创建一个切面即可

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;@Aspect
@Component
public class RetryAspect {@Before("@annotation(org.springframework.retry.annotation.Retryable)")public void beforeRetry() {System.out.println("执行重试前...");//比如记录请求发起的时间等}
}

讲解了这么多,我们还是把代码汇总一下,进行一次演示,编写一个Controller用来测试两个重试服务

@RestController
@RequestMapping("/api")
public class RetryController {@Autowiredprivate RetryService retryService;@Autowiredprivate TemplateRetryService templateRetryService;@GetMapping("/retry")public String retry() {try {return retryService.retryMethod();} catch (Exception e) {return "重试失败: " + e.getMessage();}}@GetMapping("/template-retry")public String templateRetry() {return templateRetryService.executeWithRetry();}
}

最终代码结构如下:(目的只是为了演示忽略都在一个包中)

在这里插入图片描述

再次运行测试,分别测试 /api/retry 接口以及模板重试服务的接口 /api/template-retry,结果如下:

在这里插入图片描述

OK,至此 Spring Retry 的介绍以及使用已经讲完了,小伙伴们可以根据代码片段自行定制自己的重试策略

6、总结

Spring Retry 是一个强大的工具,能够帮助我们在系统出现临时故障时自动重试,提高系统的稳定性和健壮性。在实际开发中,根据具体的业务需求和系统情况,合理配置和使用 Spring Retry,可以显著提升系统的可靠性。

本文的代码主要是演示使用,小伙伴们可以根据自己业务需求进行修改升级。如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB神经网络---激活层

非线性变换的目的 非线性变换的目的是为神经网络引入一些非线性特征&#xff0c;使其训练出一些符合各种曲线或各种特征的模型。 换句话来说&#xff0c;如果模型都是直线特征的话&#xff0c;它的泛化能力会不够好。 目录 深度学习层列表 - MATLAB & Simulink - MathWo…

初识MySQL数据库

目录 一、了解数据库 1.数据库的相关概念 2.数据库系统发展史 3.主流数据库产品 二、数据库分类 1.关系数据库 2.非关系型数据库 三、mysql的yum安装与源码编译安装 1.源码编译安装mysql 2.yum安装 mysql5.7 四、MySQL数据类型 1.常用的数据类型 五、查看数据库…

高性能8位单片机 CA51M151,1T 8051内核 / 内置12位ADC / 16 位PWM / 支持触摸 / 8K MTP

CA51M151 系列芯片是基于 1T 8051 内核的 8 位微控制器&#xff0c;不仅保留了传统 8051 芯片的基本特性&#xff0c;通常情况下运行速度比传统的 8051 芯片快 10 倍&#xff0c;性能更加优越。芯片内置 8 KB MTP 程序存储器&#xff0c;256Byte 内部RAM&#xff0c;512Byte 外…

持绪电商:开一家抖音网店大概多久才能做起来

在数字化浪潮的推动下&#xff0c;抖音不仅是年轻人喜爱的短视频平台&#xff0c;更成为电商的新阵地。不少创业者和品牌纷纷入驻&#xff0c;希望能借力抖音的流量红利实现快速成长。但开设一家抖音网店并使其蓬勃发展&#xff0c;并非一朝一夕之事&#xff0c;它需要策略、耐…

植物大战僵尸(杂交版)最新版V2.1来袭!

【新手指导】最新版v2.1来袭 1.闪退怎么办&#xff1f; 答:窗口模式可以解决大部分问题。输入法转换成英文也可以。最后一种办法管理员运行&#xff0c;再后台可运行&#xff0c;即便不是窗口也不会闪退&#xff0c;亲测有效 2.哪里下载&#xff1f; 答&#xff1a;夸克网盘htt…

【网络编程】套接字的多种可选项

可以看出&#xff0c;套接字可选项是分层的。IPPROTOIP层可选项是IP协议相关事项IPPROTO TCP层可选项是TCP协议相关的事项&#xff0c;SOLSOCKET层是套接字相关的通用可选项 getsockopt&&setsockopt #include <sys/socket.h> int getsockopt(int sock, int lev…

【JMeter接口测试工具】第二节.JMeter项目实战(下)【实战篇】

文章目录 前言一、接口弱压力测试二、高并发、高频率三、生成图形化报告总结 前言 一、接口弱压力测试 场景举例&#xff1a; 场景1:模拟半小时之内 1000 个用户访问服务器资源&#xff0c;要求平均响应时间在3000ms内&#xff0c;且错误率为0 实现步骤&#xff1a; 步骤一&am…

VirtualBox、Centos7下安装docker后pull镜像问题

Docker安装篇(CentOS7安装)_docker 安装 centos7-CSDN博客 首先&#xff0c;安装docker可以根据这篇文章进行安装&#xff0c;安装完之后&#xff0c;我们就需要去通过docker拉取相关的服务镜像&#xff0c;然后安装相应的服务容器&#xff0c;比如我们通过docker来安装mysql,…

什么是场外期权?场外期权有几种做法?

今天带你了解什么是场外期权&#xff1f;场外期权有几种做法&#xff1f;期权分为场内期权&#xff0c;场外期权。场内期权我们都知道&#xff0c;是在期货盘里购买的期权&#xff0c;但场外期权呢&#xff1f; 什么是场外期权&#xff1f; 场外期权是一种在交易所之外进行交易…

拿下SOTA!最强中文Embedding模型对标OpenAI,技术路线公开

国产大模型「日日新 5.0」已经在权威主流评测中鲨疯了。变强的背后原因竟是&#xff0c;来自商汤自研中文Embedding模型——Piccolo2。这是首个对标OpenAI向量长度的模型。 国产大模型最近在权威主流评测中「杀」疯了&#xff01; 商汤「日日新 5.0」在中文大模型测评基准Sup…

一键安全体检!亚信安全携手鼎捷软件推出企业安全体检活动 正式上线

亚信安全联合鼎捷软件股份有限公司&#xff08;以下简称“鼎捷软件”&#xff09;正式推出“一键安全体检”服务。亚信安全网络安全专家将携手鼎捷软件数据安全专家&#xff0c;围绕企业的数智安全状况&#xff0c;进行问题探索与治愈、新问题预测与预警&#xff0c;在全面筛查…

公司面试题总结(六)

31.说一说 webpack 的构建流程是什么&#xff1f; ⚫ 初始化流程&#xff1a; ◼ 从配置文件和 Shell 语句中读取与合并参数 ◼ 初始化需要使用的插件和配置插件等执行环境所需要的参数 ⚫ 编译构建流程&#xff1a; ◼ 从 Entry 发出&#xff0c;针对每个 Module 串行…

MySQL数据库初识

目录 一.数据库相关概述 1.数据库概念 数据&#xff08;Data&#xff09; 表 数据库系统 2.数据库系统发展史 当今主流数据库介绍 3.数据库分类 3.1.关系数据库 3.2.非关系型数据库 二.MySQL数据库安装 1.源码编译安装mysql 2.yum安装mysql 一.数据库相关概述 1.…

Clearedge3d EdgeWise 5.8 强大的自动化建模软件

EdgeWise是功能强大的建模软件&#xff0c;提供领先的建模功能和先进的技术&#xff0c;让您的整个过程更快更准确&#xff01;您可以获得使用自动特征提取和对象识别的 3D 建模&#xff0c;ClearEdge3D 自动建模和对象识别软件通过创建竣工文档和施工验证完成该过程。拓普康和…

Ajax的应用

1. Ajax Ajax是Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;的缩写。 Ajax技术描述了使用脚本操纵HTTP和Web服务器进行数据交换&#xff0c;在页面不刷新的情况下&#xff0c;实现页面的局部更新。 重点&#xff1a; Ajax 是一种在无需重新加…

气膜结构的使用寿命及其优势—轻空间

气膜结构以其独特的构造方式和显著的优势&#xff0c;在体育馆、展览馆、临时建筑等领域越来越受欢迎。尽管气膜结构的使用寿命与传统钢结构相比可能较短&#xff0c;但其在成本、建造速度、灵活性等方面的优势使其成为许多应用场景中的理想选择。本文将详细探讨气膜结构的使用…

如何基于Excel文件图形化从零建表并导入数据(以MySQL和SQLynx为例)

目录 1. 准备Excel数据 2. 导入Excel数据 a. 登录SQLynx b. 导入Excel文件 3. 验证数据 4. 使用和管理表 5. 总结 在实际的业务过程中&#xff0c;我们经常会有很多数据存储在Excel中&#xff0c;但在Excel中的数据分析不如使用SQL和数据库方便&#xff0c;数据量大些的…

location.href = ‘welcome.html‘;报错 - Completed 406 NOT_ACCEPTABLE

巧妙解决方案&#xff0c;使用服务端进行redirect即可 。 package com.aliyun.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping;Controller public class RedirectController {GetMapping("/r…

盲盒App开发时有哪些技术框架可以借鉴

在开发盲盒App时&#xff0c;技术框架的选择对于应用的性能、稳定性和用户体验都至关重要。以下是几个可以借鉴的技术框架&#xff0c;它们在不同方面提供了优势&#xff0c;并且结合了参考文章中的相关信息&#xff1a; 前端技术框架 微信小程序框架&#xff1a; 优点&#…

Interlinks Manager评测:WordPress 的最佳内部链接插件?

在这篇Interlinks Manager评测中&#xff0c;我们将彻底查看它是否真的是 WordPress 最佳内部链接插件&#xff01;我们还将检查它是否值得您尝试。现在就开始吧 快速浏览一下插件&#xff0c;你就会对其提供的功能有一个基本的了解。 Interlinks Manager是一款 SEO 插件&…