手机网站建设方案/南宁百度seo排名价格
文章目录
- 前言
- 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的基本使用第一步,引入Spring Retry的jar包第二步,构建一个RetryTemplate类第三步,使用RETRY_TEMPLATE注意事项 拓展方法降级操作重试策略:时间策略重试策略:指定异常策略 前言 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系统中,我们经常需要查询文件夹中包含多少文件。本文将介绍三种在Linux中查询文件夹中文件数量的方法,帮助你轻松获取所需信息。 二、方法 1、使用ls命令和wc命令 使用ls命令的-l选项和管道操作符|结合wc命令来统计文件数量…...

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

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

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

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

Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发
一、DefaultEventExecutorGroup的用途 DefaultEventExecutorGroup 是 Netty 框架中的一个类,用于管理和调度事件处理器(EventExecutor)的组。在 Netty 中,事件处理是通过多线程来完成的,EventExecutor 是处理事件的基…...

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

【网络编程】实现一个简单多线程版本TCP服务器(附源码)
TCP多线程 🌵预备知识🎄 Accept函数🌲字节序转换函数🌳listen函数 🌴代码🌱Log.hpp🌿Makefile☘️TCPClient.cc🍀TCPServer.cc🎍 util.hpp 🌵预备知识 &…...

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

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

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

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

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

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

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

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

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

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

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)
Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…...

Leetcode.995 K 连续位的最小翻转次数
题目链接 Leetcode.995 K 连续位的最小翻转次数 rating : 1835 题目描述 给定一个二进制数组 n u m s nums nums 和一个整数 k k k 。 k k k位翻转 就是从 n u m s nums nums 中选择一个长度为 k k k 的 子数组 ,同时把子数组中的每一个 0 0 0 都改成 1 1 1 …...

PHP8的跳转语句-PHP8知识详解
如果循环条件满足的时候,则程序会一直执行下去。如果需要强制跳出循环,则需要使用跳转语句来完成。PHP8的跳转语句包括break语句、continue语句和goto语句。 1、break语句 break语句的作用是完全终止循环,包括while、do…while、for、switch…...

Idea中maven无法下载源码
今天在解决问题的时候想要下载源码,突然发现idea无法下载,这是真的蛋疼,没办法查看原因,最后发现问题的原因居然是因为Maven,由于我使用的idea的内置的Bundle3的Maven,之前没有研究过本地安装和内置的区别&…...
【linux-keepalive】keepalive避免单点故障,高可用配置
keepalive: [rootproxy ~]# yum install -y keepalived [rootproxy ~]# vim /etc/keepalived/keepalived.conf global_defs {router_id proxy1 //设置路由ID号vrrp_iptables //不添加任何防火墙规则 } vrrp_instance V…...

测试网络模型的FLOPs和params
概念 FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。 FLOPs:注意s小写,是floating point operations的缩写…...

《树莓派项目实战》第十五节 使用L298N驱动板模块驱动双极42步进电机
目录 15.1 双极步进电机引脚介绍 15.2 连接到树莓派 15.3 编写代码驱动步进电机 在本节,我们将学习如何使用L298N驱动板驱动一个双极42步进电机。该项目涉及到的材料有: 树莓派...

基于短信宝API零代码实现短信自动化业务
场景描述: 基于短信宝开放的API能力,实现在特定事件(如天气预警)或定时自动发送短信(本文以定时群发短信为例)。通过Aboter平台如何实现呢? 使用方法: 首先创建一个IPaaS流程&…...

Qt应用开发(基础篇)——信号槽 Signals and Slots
一、前言 Qt成为我们今天拥有的灵活而舒适的工具,除了友好和能够快速开发设计师界面,信号槽机制是最大的核心特征,也是区别于其他开发框架最大的优势。 Qt的信号槽作用于两个对象之间的通信。当一个对象发生了改变,它希望其他关心…...

正则表达式--Notepad++常用的替换
原文网址:正则表达式--Notepad常用的替换_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad使用正则表达式进行替换时的常用的一些示例。 服务器JSON的格式化 例1:将回车去掉,改为正确的JSON格式 搜索: ([^,])(\r)(\n)(\s) 替…...