Spring-Retry实现及原理

news2024/10/6 21:23:48

前言

重试,其实我们其实很多时候都需要的,为了保证容错性,可用性,一致性等。一般用来应对外部系统的一些不可预料的返回、异常等,特别是网络延迟,中断等情况。还有在现在流行的微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1,timeout=500调用失败只重试1次,超过500ms调用仍未返回则调用失败。如果我们要做重试,要为特定的某个操作做重试功能,则要硬编码,大概逻辑基本都是写个循环,根据返回或异常,计数失败次数,然后设定退出条件。这样做,且不说每个操作都要写这种类似的代码,而且重试逻辑和业务逻辑混在一起,给维护和扩展带来了麻烦。从面向对象的角度来看,我们应该把重试的代码独立出来。
 

痛点

请看大屏幕

一、代码实现


①maven引入依赖

<dependency>

    <groupId>org.springframework.retry</groupId>

    <artifactId>spring-retry</artifactId>

</dependency>

②启动类

proxyTargetClass :指定动态代理使用JDK还是CGLIB

@EnableRetry(proxyTargetClass = true)

③重试方法(需要重试的方法)

核心注解:@Retryable

@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))

@Override

public int retry(int code) throws Exception {

    System.out.println("retry方法被调用,时间:" + LocalTime.now());

    if (0 == 0) {

        throw new Exception("调用异常了");

    }

    System.out.println("retry方法正常调用");

    return 200;

}

④回调方法(重试失败之后的兜底操作)

核心注解:@Recover

@Recover

public int recover(Exception e, int code) {

    System.out.println("执行回调方法!!!!" + code);

    //记日志到数据库 或者调用其余的方法

    return 400;

}

踩坑:

踩坑

1、异常处理方法返回参数必须与retry方法保持一致
2、该方法必须与retry方法在同一个类中

以上就对一个方法完成了一个简单的重试功能。


 

二、首先了解一些关键内容

①重试策略:看一下Spring Retry自带的一些重试策略,主要是用来判断当方法调用异常时是否需要重试

  • SimpleRetryPolicy 默认最多重试3次
  • TimeoutRetryPolicy 默认在1秒内失败都会重试
  • ExpressionRetryPolicy 符合表达式就会重试
  • CircuitBreakerRetryPolicy 增加了熔断的机制,如果不在熔断状态,则允许重试
  • CompositeRetryPolicy 可以组合多个重试策略
  • NeverRetryPolicy 从不重试(也是一种重试策略哈)
  • AlwaysRetryPolicy 总是重试

②退避策略:退避是指怎么去做下一次的重试,在这里其实就是等待多长时间

  • FixedBackOffPolicy 默认固定延迟1秒后执行下一次重试
  • ExponentialBackOffPolicy 指数递增延迟执行重试,默认初始0.1秒,系数是2,那么下次延迟0.2秒,再下次就是延迟0.4秒,如此类推,最大30秒。
  • ExponentialRandomBackOffPolicy 在上面那个策略上增加随机性
  • UniformRandomBackOffPolicy 这个跟上面的区别就是,上面的延迟会不停递增,这个只会在固定的区间随机
  • StatelessBackOffPolicy 这个说明是无状态的,所谓无状态就是对上次的退避无感知,从它下面的子类也能看出来

三、引出问题,Spring是如何实现的

①入口注解:@EnableRetry

  

核心注解

1、开启AOP:@EnableAspectJAutoProxy(proxyTargetClass = false)

2、注入RetryConfiguration:@Import(RetryConfiguration.class)  (核心)

②一起看看RetryConfiguration是干什么的
继承AbstractPointcutAdvisor,实现IntroductionAdvisor, BeanFactoryAware 

上面断处是我们AOP中熟悉的切面和增强

③核心拦截器:AnnotationAwareRetryOperationsInterceptor

核心实现: 

 这里主要是看我们有没有自定义拦截器,如果有的话,默认优先使用自定义的拦截器。


简单实现:getStatelessInterceptor

④核心拦截器:RetryOperationsInterceptor
Spring源码中一般出现了execute(),一般就是真正开始干活了,这里也一样

⑤具体实现

1、第一个标注点:判断是否可以重试

2、第二个标注点:执行重试

 

⑥三种实现

 

 这三个类都是Java中的线程休眠工具类,但它们的作用略有不同:

  1. ObjectWaitSleeper:该类是通过调用对象的wait()方法来使线程休眠的。当一个线程调用对象的wait()方法时,它会释放该对象的锁,并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。

  2. StealingSleeper:该类是通过调用Thread.yield()方法来使线程休眠的。当一个线程调用Thread.yield()方法时,它会暂停当前线程的执行,让其他线程有机会运行。

  3. ThreadWaitSleeper:该类是通过调用Thread.sleep()方法来使线程休眠的。当一个线程调用Thread.sleep()方法时,它会暂停当前线程的执行,让其他线程有机会运行,但不会释放任何锁。

⑦ThreadWaitSleeper

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

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

相关文章

PDF4NET 13.1.0 Crack

PDF4NET 13.1.0 添加对云多边形和云方形注释的支持。 2023 年 6 月 1 日 - 16:50 新版本 特征 PDF4NET 添加了对 Cloud polygon 和 Cloud square 注释的支持。在文本标记注释中添加了对四点的支持。重大变化&#xff1a;重构了圆形、方形、折线和多边形注释的边框。PDF4NET.Ren…

Linux-线程基础

Linux线程基础 一&#xff0c;线程概念什么是线程Linux如何实现的线程 二&#xff0c;页表与虚拟内存虚拟内存多级页表 三&#xff0c;线程的特点线程的优点线程的缺点线程异常线程用途线程与进程比较 四&#xff0c;线程控制创建线程线程终止线程等待线程取消线程分离 五&…

python+vue宠物用品商城网站系统3zy71

依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上宠物管理系统是一项十分重要并且有价值的事情。对于传统的宠物管理控制模型来说&#xff0c;在线宠物管理系统具有许多不可比拟的优势&#xff0c;首先是快速更新宠物分类、宠物信息、热销排行榜、宠物寄养&#xff0…

【嵌入式烧录/刷写文件】-1.8-S19文件转换为Hex文件

案例背景(共5页精讲)&#xff1a; 有如下一段Motorola S-record(S19/SREC/mot/SX)文件&#xff0c;将其转换为Hex文件。 S0110000486578766965772056312E30352EA6 S123910058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775B S123912078797A7B7C7D7E7F8081…

CodeWhisperer 初体验

今年算是 AI 正式破圈的一年&#xff0c;无数的工具&#xff0c;产品横空出世。无论在面向企业的大语言模型&#xff0c;还是帮助个人的 AI 工具&#xff0c;数不胜数。其中关于 AI 编程助手领域&#xff0c;近年来也涌现了很多不错的产品&#xff0c;例如 Copilot, Cursor, 还…

网络爬虫技术在搜索引擎中的应用

网络爬虫技术在搜索引擎中扮演着非常重要的角色&#xff0c;主要应用在以下几个方面&#xff1a; 网页抓取&#xff1a;搜索引擎需要从互联网上抓取大量的网页&#xff0c;以建立自己的索引库。网络爬虫技术可以帮助搜索引擎快速、高效地抓取网页。 网页解析&#xff1a;搜索引…

vue 自适应的方法

1、使用 filter来处理。 2、使用vue3.x中的 filter &#xff08;&#xff09;方法&#xff0c;但是要注意 filter &#xff08;&#xff09;方法的返回是一个字符串&#xff0c;在进行渲染时可能会有问题。 3、使用 react. js中的 require &#xff08;&#xff09;方法&#x…

实时数仓中数据实时输出的思考与实现

随着数据量不断增长以及提升企业竞争力的需求增长&#xff0c;实时数仓已经成为了许多业务和组织的重要数据架构之一。在实时数仓中&#xff0c;数据实时输入和数据实时分析是关键步骤&#xff0c;但同样重要的是如何将处理后的数据输出到各种目标上。本文将探讨实时数仓中数据…

亚马逊正常购物下单流程是怎么样的?

当您想要在亚马逊上购物时&#xff0c;您可以按照以下步骤进行&#xff1a; 1、登录亚马逊账户&#xff1a;在亚马逊的官方网站上&#xff0c;使用您的亚马逊账户进行登录。如果您还没有账户&#xff0c;可以在网站上注册一个新账户。 2、浏览商品&#xff1a;在亚马逊首页上&…

CASAIM受邀参加广东省科学院幼儿园举行的第二届STEAM科技节暨庆“六一”科普嘉年华活动

今年6月1日是第63个“六一”国际儿童节&#xff0c;恰“接棒”第7个全国科技工作者日。CASAIM受邀参加广东省科学院幼儿园举行的第二届STEAM科技节暨庆“六一”科普嘉年华活动&#xff0c;展示高精度的三维扫描和3D打印技术&#xff0c;为广大儿童送上精彩的科普大礼。 从小朋友…

视图及其缩放

相机控制 在本课中&#xff0c;您将学习如何通过使用 ViewCube 更改模型视图来检查您的设计。 学会环顾四周 在创建设计时&#xff0c;能够从各个方面看到您的设计会有所帮助。 让我们了解如何更改视图。 你能旋转你的视图看看谁在幕后吗&#xff1f;ViewCube&#xff08;…

最新office365个人和家庭版下载及功能介绍

到了台新联想笔记本&#xff0c;想试试随机带的office365&#xff0c;才发现要有microsoft账户&#xff0c;要重新注册账号。 搞了一圈&#xff0c;很麻烦&#xff0c;发现微软登陆帐号时一直在转圈圈&#xff0c;而无法完成登录。 大概率还是因为服务器在海外的原因。 于是索性…

【企业化架构部署】Apache配置与应用

文章目录 一、构建虚拟web主机1.概述2.httpd服务支持的虚拟主机类型3.构建虚拟Web主机3.1基于域名的虚拟主机3.2基于IP地址的虚拟主机3.3基于端口的虚拟主机 4.Apache连接保持5.Apache访问控制 二、Apache日志管理rotatelogs分隔工具 三、总结1.Web虚拟主机部署步骤2.网页根目录…

【UE5 新手向】网络同步1 —— 开启 Actor 的位置网络同步

新建一个第三人称 C 项目 在播放设置中&#xff0c;将 Number of Players 改为2&#xff0c;并将 Net Mode 改为Play As Listen Server。 播放游戏&#xff0c;可以发现角色默认开启了同步。 停止播放&#xff0c;选中场景中的某个物体。 在 Details 面板选择新建蓝图。 选…

chatgpt赋能python:Python编程实现文件备份功能

Python编程实现文件备份功能 数据对于任何企业都是极其重要的。文件备份是数据备份的一种重要形式。在发生系统损坏、恶意攻击、误操作等情况时能够帮助我们恢复数据。本文将介绍如何使用Python编程实现文件备份功能。 备份的重要性 对于企业而言&#xff0c;数据备份就像是…

clang 01. clang driver流程分析

文章目录 前言在这里简要概述一下clang的流程 1.clang driver代码分析1.1创建诊断&#xff08;DIagnosticsEngine&#xff09;实例1.2创建Driver(clang::driver::Driver)的实例1.3通过Driver的BuildCompilation方法生成需要执行的命令1.4Jobs构建完成&#xff0c;通过Driver的E…

OS-文件管理1-文件-文件的逻辑结构与物理结构。

一&#xff0c;文件管理 关键词&#xff1a;如何组织及提供的功能。 二&#xff0c;文件-文件基本概念。 1.文件&#xff0c;记录&#xff0c;数据项 2.文件属性 三&#xff0c;文件-文件控制块FCB与索引结点。 文件控制块FCB&#xff1a;用来存放控制文件需要的各种信息…

在软件定义汽车的时代,低代码究竟给车企数字化转型带来了什么?

前言&#xff1a; 软件定义汽车&#xff08;Software Defined Vehicles, SDV&#xff09;&#xff0c;是由百度自动驾驶事业部总经理王劲提出的概念。其核心思想是&#xff0c;决定未来汽车的是以人工智能为核心的软件技术&#xff0c;而不再是汽车的马力大小&#xff0c;是否…

Java并发体系-第三阶段-JUC并发包-[1]

AtomicXXXFieldUpdater 算是一个小补充 简介 public class AtomicIntegerFieldUpdaterTest {public static void main(String[] args) {AtomicIntegerFieldUpdater<Test> updater AtomicIntegerFieldUpdater.newUpdater(Test.class, "value");Test ts new T…

Maven处理依赖冲突

1.java常用的包依赖异常有&#xff1a; 1&#xff09;AbstractMethodError 2&#xff09;NoClassDefFoundError 3&#xff09;ClassNotFoundException 4&#xff09;LinkageError Maven会根据pom文件中的groupId、artifactId、version来判断jar是否冲突 如果出现了同名不…