【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry

文章目录

  • 前言
  • Spring Retry的基本使用
    • 第一步,引入Spring Retry的jar包
    • 第二步,构建一个RetryTemplate类
    • 第三步,使用RETRY_TEMPLATE
    • 注意事项
  • 拓展方法
    • 降级操作
    • 重试策略:时间策略
    • 重试策略:指定异常策略

前言

Spring Retry 是 Spring Framework 中的一个模块,提供了一种简单的方式来在应用程序中实现重试机制。

在应用程序中,如果遇到了一些不可避免的错误,比如网络连接失败、数据库连接失败等,我们通常需要对这些错误进行重试,以尝试解决这些问题。Spring Retry 提供了一个可插拔的、面向切面的重试框架,可以让我们很容易地在应用程序中实现重试机制。

Spring Retry 中最常用的类是 RetryTemplate,它提供了一个 execute 方法,可以让我们在方法调用失败时进行重试。RetryTemplate 中可以设置最大重试次数、重试间隔时间等参数。此外,还可以设置重试条件,如重试的异常类型、重试策略等。

今天我们来讲一下Spring Retry

Spring Retry的基本使用

第一步,引入Spring Retry的jar包

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

第二步,构建一个RetryTemplate类

这段代码展示了如何使用Spring Retry库创建一个RetryTemplate实例来进行重试操作。该实例最多进行3次尝试,每次重试的时间间隔会指数级增长,最大可达10分钟,重试只会在ArithmeticException异常发生时进行。

private static final RetryTemplate RETRY_TEMPLATE = RetryTemplate.builder()
            .maxAttempts(3)
            .exponentialBackoff(5000, 3, 600000L)
            .retryOn(ArithmeticException.class)
            .build();

第三步,使用RETRY_TEMPLATE

Boolean test2 = RETRY_TEMPLATE.execute((RetryCallback<Boolean, ArithmeticException>) context -> {

            System.out.println("test" + context.getRetryCount());
            int i = 1 / 0;
            System.out.println("test2");

            return Boolean.FALSE;
        });

        System.out.println(test2);

使用 RETRY_TEMPLATE.execute 方法执行一个 RetryCallback,里面放置需要重试的逻辑代码。这段示例代码中,在逻辑代码中将会抛出 ArithmeticException 异常,然后框架会自动尝试重试,最终返回 Boolean.FALSE。
这里的运行结果为
在这里插入图片描述

在这个具体的例子中,返回true或者false的区别在于当RetryTemplate达到最大重试次数时,如果RetryCallback的执行结果为true,则RetryTemplate会认为重试成功并结束重试;

如果RetryCallback的执行结果为false,则RetryTemplate会认为重试失败并抛出RetryException异常。

总的来说,true表示成功,false表示失败。但是需要根据具体的场景和语义来确定具体的含义。在这个例子中,返回true表示重试成功,返回false表示重试失败。即test2的值。

注意事项

需要注意的是context.getRetryCount()的值是从0开始的,如果maxAttempts设置为3的话,那就最大值为3-1=2
所以我们可以根据该方法进行业务的判断

在这里插入图片描述

值得注意的是,retryOn()只会重试指定类型的错误以及其子类,并且当抛出的错误类型为非运行是异常的情况需要在方法上面抛出
在这里插入图片描述

另外,我们可以捕获对应的异常,并且在catch中抛出且可以进行业务的控制

在这里插入图片描述

拓展方法

RetryTemplate是Spring Retry提供的核心类,可以用来进行方法调用的重试操作。除了上面提到的execute()方法,RetryTemplate还提供了其他一些常用的方法和配置选项,下面介绍一些常见的用法:

降级操作

execute(RetryCallback<T, E> retryCallback, RecoveryCallback recoveryCallback):除了可以传入一个RetryCallback接口,执行需要重试的方法调用外,还可以传入一个RecoveryCallback接口,用于在重试次数达到上限后执行降级操作。RecoveryCallback接口提供一个recover(RetryContext context)方法,可以在该方法中实现降级逻辑。例如:

RetryTemplate retryTemplate = RetryTemplate.builder()
        .maxAttempts(3)
        .build();

retryTemplate.execute((RetryCallback<Void, RuntimeException>) context -> {
    // 需要重试的方法调用
    someService.someMethod();
    return null;
}, (RecoveryCallback<Void>) context -> {
    // 重试次数达到上限后执行降级操作
    fallbackService.fallbackMethod();
    return null;
});

重试策略:时间策略

setBackOffPolicy(BackOffPolicy backOffPolicy):设置重试策略,即在每次重试之间的等待时间策略。BackOffPolicy接口提供了多个实现类,例如ExponentialBackOffPolicy、FixedBackOffPolicy等。例如:

ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(1000);  // 初始等待时间1000ms
backOffPolicy.setMultiplier(2.0);  // 每次重试等待时间乘以2
backOffPolicy.setMaxInterval(60000);  // 最大等待时间60000ms

RetryTemplate retryTemplate = RetryTemplate.builder()
        .maxAttempts(3)
        .backOffPolicy(backOffPolicy)
        .build();

retryTemplate.execute((RetryCallback<Void, RuntimeException>) context -> {
    // 需要重试的方法调用
    someService.someMethod();
    return null;
});

重试策略:指定异常策略

setRetryPolicy(RetryPolicy retryPolicy):设置重试策略,即在哪些异常情况下进行重试。RetryPolicy接口提供了多个实现类,例如SimpleRetryPolicy、TimeoutRetryPolicy、CompositeRetryPolicy等。例如:

SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(3);  // 最大重试次数

RetryTemplate retryTemplate = RetryTemplate.builder()
        .retryPolicy(retryPolicy)
        .build();

retryTemplate.execute((RetryCallback<Void, RuntimeException>) context -> {
    // 需要重试的方法调用
    someService.someMethod();
    return null;
});

RetryPolicy和RetryOn都是Spring Retry中的重试机制,但它们的作用略有不同。

RetryPolicy用于定义重试策略,即在发生异常时应该如何重试,它包括重试的次数、重试的间隔时间、是否需要使用指数退避等信息。在RetryTemplate中,我们可以使用RetryPolicy来创建一个重试模板。

RetryOn用于定义哪些异常会触发重试,即重试的条件。在RetryTemplate中,我们可以使用RetryOn来指定需要重试的异常类型。通常,我们使用RetryOn来定义需要重试的异常类型,并使用RetryPolicy来定义重试策略。

总体来说,RetryOn和RetryPolicy是配合使用的,RetryOn指定需要重试的异常类型,RetryPolicy定义重试策略。这样,当指定的异常类型发生时,RetryTemplate就会根据定义的重试策略进行重试。

Spring Retry为我们提供了丰富的配置选项,允许我们根据具体需求定制重试策略和回退逻辑。无论是简单的定时重试,还是根据异常类型进行有条件的重试,Spring Retry都能灵活满足我们的各种需求。

在使用Spring Retry时,建议根据实际场景仔细选择重试策略,合理设置最大重试次数和重试间隔,以免对系统和依赖造成不必要的压力。同时,对于一些不可恢复的错误,我们也应该考虑合理的异常处理策略,避免陷入无限重试的死循环。

总的来说,Spring Retry是一个强大且易于使用的工具,可以帮助我们有效应对应用程序中的不稳定性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吉利科技携手企企通,打造集团化数智供应链系统

近日&#xff0c;吉利科技集团有限公司&#xff08;以下简称“吉利科技”&#xff09;联合企企通成功召开SRM采购供应链管理项目启动会。企企通与吉利科技高层、项目负责人与团队成员出席此次启动会。 双方将携手在企业供应商全生命周期管理、采购全流程、电子招投标、采购分析…

opencv动态目标检测

文章目录 前言一、效果展示二、实现方法构造形态学操作所需的核:创建背景减除模型:形态学操作:轮廓检测: 三、代码python代码C代码 总结参考文档 前言 很久没更新文章了&#xff0c;这次因为工作场景需要检测动态目标&#xff0c;特此记录一下。 一、效果展示 二、实现方法 基…

华为运动健康,十年创新天地宽

我听一位朋友讲过这样一个故事。某天早上&#xff0c;急诊科的医生迎来了一位患者&#xff0c;患者进来后直接说&#xff1a;“大夫&#xff0c;我房颤了。” 这位医生非常诧异&#xff0c;因为心脏房颤确实非常危急&#xff0c;但很多时候并没有明显的生理体征&#xff0c;患者…

Flutter:屏幕适配

flutter_screenutil flutter_screenutil是一个用于在Flutter应用程序中进行屏幕适配的工具包。它旨在帮助开发者在不同屏幕尺寸和密度的设备上创建响应式的UI布局。 flutter_screenutil提供了一些用于处理尺寸和间距的方法&#xff0c;使得开发者可以根据设备的屏幕尺寸和密度…

基于Crow的C++的WebSocket服务器

基于Crow的C的WebSocket服务器 一、WebSocket 1.1 什么是WebSocket WebSocket 是一种持久化的通讯协议。 很多网站为了实现推送技术&#xff0c;所用的技术都是轮询&#xff0c;这种解决方案是指由浏览器每隔一段时间向服务器发出 HTTP 请求&#xff0c;然后服务器返回最新的…

React源码解析18(2)------ FilberNode,FilberRootNode结构关系

摘要 在上一篇&#xff0c;我们实现了通过JSX转换为ReactElement的方法&#xff0c;也看到了转换后React元素的结构。但是这个React元素&#xff0c;并不能很清楚的表达组件之间的关系&#xff0c;以及属性的处理。 所以在React内部&#xff0c;会将所有的React元素转换为Fil…

idea集成svn

一、注意 安装svn客户端的时候一定要勾选&#xff0c;否则在idea上集成svn的时候会找不到 svn.exe 而报错。 如果当初安装时忘记勾选&#xff0c;重新运行安装包&#xff0c;选择modify&#xff0c;勾选command line client tools项中的内容。 二、配置idea集成svn 三、检出(c…

电影票接单售票小程序搭建--java开源+后台管理系统

要搭建一个电影票接单售票小程序和后台管理系统&#xff0c;可以采取以下步骤&#xff08;以下步骤不分先后&#xff09;&#xff1a; 设计系统架构首先需要设计系统的整体架构&#xff0c;确定系统的技术选型、功能模块和业务流程等。可以考虑使用微服务架构&#xff0c;将系…

Jmeter添加cookie的两种方式

jmeter中添加cookie可以通过配置HTTP Cookie Manager&#xff0c;也可以通过HTTP Header Manager&#xff0c;因为cookie是放在头文件里发送的。 实例&#xff1a;博客园点击添加新随笔 https://i.cnblogs.com/EditPosts.aspx?opt1 如果未登录&#xff0c;跳转登录页&#xf…

MongoDB SQL

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.4\binC:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin>net start MongoDB 请求的…

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注…

FPGA应用学习笔记--时钟域的控制 亚稳态的解决

时钟域就是同一个时钟的区域&#xff0c;体现在laways语句边缘触发语句中&#xff0c;设计规模增大就会导致时钟不同步&#xff0c;有时差&#xff0c;就要设计多时钟域。 会经过与门的延时产生的新时钟域&#xff0c;这种其实不推荐使用&#xff0c;但在ascl里面很常见 在处理…

开发工具Eclipse的使用

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Eclipse是什么 二.使用Eclipse的…

openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句

文章目录 openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句35.1 语法格式35.2 参数说明35.3 示例 openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句 修改表&#xff0c;包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所…

激活函数总结(四):Hard系列激活函数补充(HardSigmoid、HardTanh、Hardswish)

激活函数总结&#xff08;四&#xff09;&#xff1a;Hard系列激活函数补充 1 引言2 激活函数2.1 HardSigmoid激活函数2.2 HardTanh激活函数2.3 Hardswish激活函数 3. 总结 1 引言 在前面的文章中已经介绍了过去大家较为常见的激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PRe…

Vue中使用qrcode说明

1.安装 npm i qrcode1.5.3 2.导入 import QRCode from qrcode 3.转换 说明&#xff1a;拿到服务器传来的字符串&#xff0c;转换成base64&#xff0c;然后通过img标签展示。 // 字符串转成二维码 let result await this.$API.reqPayInfo(this.orderId); 总结&#xff1a;

资深媒体人宋繁银加入《数据猿》任总编辑,全面负责公司整体内容工作

大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年7月北京&#xff0c;《数据猿》宣布正式任命宋繁银为总编辑&#xff0c;全面负责公司整体内容工作。此次重要的人事任命标志着《数据猿》的发展迈上了一个新的台阶&#xff0c;对于《数据猿》团队而言&#xff0c;不仅是一…

客户端渲染和服务端渲染的区别

一、客户端渲染 页面的渲染工作都是由浏览器来完成的&#xff0c;服务器只是负责提供数据。前端去后端取数据生成DOM树。 **最少两次请求 ** 第一次请求拿到的是页面第二次请求拿到的是动态数据 二、服务端渲染 页面渲染的工作都是由服务端来完成的&#xff0c;数据也是由服…

python版《羊了个羊》游戏开发第一天

Python小型项目实战教学课《羊了个羊》 一、项目开发大纲&#xff08;初级&#xff09; 版本1.0&#xff1a;基本开发 课次 内容 技术 第一天 基本游戏地图数据 面向过程 第二天 鼠标点击和移动 面向对象 第三天 消除 设计模式&#xff1a;单例模式 第四天 完整…

OpenCV 中的光流 (C++/Python)

什么是光流? 光流是一项视频中两个连续帧之间每像素运动估计的任务。基本上,光流任务意味着计算像素的位移矢量作为两个相邻图像之间的对象位移差。光流的主要思想是估计物体由其运动或相机运动引起的位移矢量。 理论基础 假设我们有一个灰度图像——具有像素强度的矩阵。我…