当前位置: 首页 > news >正文

【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);  // 最大等待时间60000msRetryTemplate 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是一个强大且易于使用的工具,可以帮助我们有效应对应用程序中的不稳定性。

相关文章:

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

文章目录 前言Spring Retry的基本使用第一步&#xff0c;引入Spring Retry的jar包第二步&#xff0c;构建一个RetryTemplate类第三步&#xff0c;使用RETRY_TEMPLATE注意事项 拓展方法降级操作重试策略&#xff1a;时间策略重试策略&#xff1a;指定异常策略 前言 Spring Retr…...

pagehelper 优化自定义分页和排序位置

pagehelper开源地址 https://github.com/pagehelper/Mybatis-PageHelper 1.手写Count查询优化 源码分页count时首先是判断是否存在手写的 {业务查询id}_COUNT 的查询count统计 private Long count(Executor executor, MappedStatement ms, Object parameter,RowBounds rowBound…...

Linux下查询文件夹中文件数量的方法

一、前言 在Linux系统中&#xff0c;我们经常需要查询文件夹中包含多少文件。本文将介绍三种在Linux中查询文件夹中文件数量的方法&#xff0c;帮助你轻松获取所需信息。 二、方法 1、使用ls命令和wc命令 使用ls命令的-l选项和管道操作符|结合wc命令来统计文件数量&#xf…...

PS透明屏,在科技展示中,有哪些优点展示?

PS透明屏是一种新型的显示技术&#xff0c;它将传统的显示屏幕与透明材料相结合&#xff0c;使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性&#xff0c;通…...

Hbase-面试题

1. Hbase-region切分 自动切分&#xff0c;默认情况下 2.0版本&#xff0c;第一次region的数据达到256M&#xff0c;会进行切分&#xff0c;以后就是每达到10G切分一次&#xff0c;切分完成后&#xff0c;会进行负载均衡&#xff0c;均衡到其他regionserver预分区自定义rowke…...

图的宽度优先深度优先遍历

图常见的遍历方式有两种&#xff0c;一种是宽度优先遍历&#xff0c;一种是深度优先遍历。 宽度优先遍历 宽度优先遍历和之前介绍的二叉树的层级遍历类似&#xff0c;主要也是利用Queue来完成层级的遍历&#xff0c;除此之外&#xff0c;因为图中很可能有环&#xff0c;所以还…...

redis Set类型命令

Redis中的Set是一种无序、不重复的集合数据结构&#xff0c;它提供了一系列的操作命令用于对Set进行添加、删除和查找等操作。以下是Redis中Set类型常见的一些命令&#xff1a; SADD key member [member …]&#xff1a;将一个或多个成员添加到指定的集合中。 示例&#xff1a;…...

Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发

一、DefaultEventExecutorGroup的用途 DefaultEventExecutorGroup 是 Netty 框架中的一个类&#xff0c;用于管理和调度事件处理器&#xff08;EventExecutor&#xff09;的组。在 Netty 中&#xff0c;事件处理是通过多线程来完成的&#xff0c;EventExecutor 是处理事件的基…...

TCP的四次挥手与TCP状态转换

文章目录 四次挥手场景步骤TCP状态转换 四次挥手场景 TCP客户端与服务器断开连接的时候&#xff0c;在程序中使用close()函数&#xff0c;会使用TCP协议四次挥手。 客户端和服务端都可以主动发起。 因TCP连接时候是双向的&#xff0c;所以断开的时候也是双向的。 步骤 三次…...

【网络编程】实现一个简单多线程版本TCP服务器(附源码)

TCP多线程 &#x1f335;预备知识&#x1f384; Accept函数&#x1f332;字节序转换函数&#x1f333;listen函数 &#x1f334;代码&#x1f331;Log.hpp&#x1f33f;Makefile☘️TCPClient.cc&#x1f340;TCPServer.cc&#x1f38d; util.hpp &#x1f335;预备知识 &…...

centos离线部署docker

有些内部环境需要离线部署&#xff0c;以下做一些备忘。 环境&#xff1a;centos7.9 准备文件&#xff1a; docker-20.10.9.tgz&#xff0c;下载地址 https://download.docker.com/linux/static/stable/x86_64/docker.service&#xff0c;内容见下文daemon.json&#xff0c;内…...

ffmpeg使用滤镜对视频进行处理播放

一、前言 在现代的多媒体处理中,视频和音频滤镜起着至关重要的作用。可以帮助开发者对视频和音频进行各种处理,如色彩校正、尺寸调整、去噪、特效添加等。而FFmpeg作为一个功能强大的开源多媒体框架,提供了丰富的滤镜库,使我们能够轻松地对多媒体文件进行处理和转换。 本…...

Ansible Handlers模块详解,深入理解Ansible Handlers 自动化中的关键组件

深入理解Ansible Handlers 自动化中的关键组件 在现代的IT环境中&#xff0c;自动化已经成为提高效率和减少错误的关键。Ansible作为一款流行的自动化工具&#xff0c;通过使用Playbooks来定义和执行任务。而Handlers作为Ansible的组件之一&#xff0c;在自动化过程中发挥着重要…...

threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率

先来个效果图 之前写的那个稍微有点问题&#xff0c;帧率只有30&#xff0c;参照官方代码修改后&#xff0c;帧率可以达到50了&#xff0c;在不全屏的状态下&#xff0c;帧率60 1.首先需要导入库 // 用于模型边缘高亮 import { EffectComposer } from "three/examples/js…...

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群&#xff0c;其架构如上图所示&#xff…...

【MySQL】select相关

文章目录 迭代器distinct 关键字limit offset 关键字order by 列名 asc\descselect语句的执行顺序几点注意 迭代器 指向第一个元素 使用hasNext()进行判断后才进行取元素 resultSet&#xff1a;指向第一个元素前一个 distinct 关键字 去除一列中的重复元素 可以进行多行的去重…...

在Python中应用RSA算法实现图像加密:基于Jupyter环境的详细步骤和示例代码

一、引言 在当今的数字化社会中,信息安全问题备受关注。随着数字图像在生活中的应用越来越广泛,图像的安全性和隐私性也成为人们关心的焦点。如何在网络上安全地传输和存储图像已经成为一项重要的挑战。RSA(Rivest-Shamir-Adleman)算法作为一种被广泛应用的公钥密码体系,…...

Prometheus Blackbox Exporter 的 HTTP 探测指标中各个阶段的时间统计信息

在 Prometheus Blackbox Exporter 的 HTTP 探测指标中&#xff0c;probe_http_duration_seconds 指标包含各个阶段的时间统计信息。这些阶段代表了 HTTP 探测的不同阶段和指标。以下是各个阶段的含义&#xff1a; phase"dns_lookup"&#xff1a;这是指进行 DNS 查找…...

数据结构之时间复杂度-空间复杂度

大家好&#xff0c;我是深鱼~ 目录 1.数据结构前言 1.1什么是数据结构 1.2什么是算法 1.3数据结构和算法的重要性 1.4如何学好数据结构和算法 2.算法的效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 【实例1】&#xff1a;双重循环的时间复杂度&#xf…...

新一代构建工具 maven-mvnd

新一代构建工具 maven-mvnd mvnd的前世今生下载安装 mvndIDEA集成 mvnd的前世今生 maven 作为一代经典的构建工具&#xff0c;流行了很多年&#xff0c;知道现在依然是大部分Java项目的构建工具的首选&#xff1b;但随着项目复杂度提高&#xff0c;代码量及依赖库的增多使得ma…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

【Qt】控件 QWidget

控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态&#xff1a;enabled几何&#xff1a;geometrywindows frame 窗口框架的影响 窗口标题&#xff1a;windowTitle窗口图标&#xff1a;windowIconqrc 机制 窗口不透明度&#xff1a;windowOpacity光标&#xff1a;cursor…...