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

我是如何使用Spring Retry减少1000 行代码

使用 Spring Retry 重构代码的综合指南。

问题介绍

在我的日常工作中,我主要负责开发一个庞大的金融应用程序。当客户发送请求时,我们使用他们的用户 ID 从第三方服务获取他们的帐户信息,保存交易并更新缓存中的详细信息。尽管整个流程看起来足够简单,但这些下游系统中的每一个都是不可靠的。我们必须在每一层上实现重试,并且我们必须以一种可以控制重试次数和每次重试之间的延迟的方式来实现,这样我们就不会超载下游系统。由于我无法共享实际代码,我会创建一个演示系统来做简单表示:

由于我们必须在每一层上实现重试,因此我们必须编写大量样板代码,这不仅容易出错,而且难以维护。由于每个下游系统都有自己的重试要求,因此我们最终添加了越来越多的代码,最终就像在现有垃圾之上添加垃圾一样。随着时间的推移,代码变得非常脆弱,即使是很小的变化也会破坏整个系统。

解决方案

为了解决这个问题我们决定使用 Spring Retry。

Spring Retry 项目地址: http://github.com/spring-proj…

Spring Retry 是 Spring Batch 的一个子项目,它提供了一组注解和接口,我们可以使用它们向代码添加重试逻辑。它提供了一种向代码添加重试逻辑的声明性方法。

作为本文的一部分,我们将了解如何使用 Spring Retry 重写现有代码,以及它如何帮助我将代码库减少 1000 行。在展示新代码时,我将解释每个代码的注解和用例。

在研究重构的代码之前,让我们先了解一下在项目中设置 Spring 重试所涉及的步骤。

Let’s start hacking!

1. 设置 Spring 重试

将以下依赖项添加到我们的 pom.xml 文件中:

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.8.RELEASE</version>
</dependency>
  1. 在 spring 配置上启用 Spring 重试,并使用以下注解:
@Configuration
@EnableRetry
public class ApplicationConfig { }

2. 重构代码

既然我们已经设置了 Spring Retry,那么让我们开始重构代码。

  1. 以下是一个查询用户全名的代码示例,左边是老代码,右边是使用了 Spring Retry 的新代码。

使用 @Retryable 注解,我们通过 retryFor 属性指定要重试的异常数组,使用 maxAttempts 属性,可以指定要重试的次数。

2.具有指数退避的缓存重试

一下图片是一个添加缓存的代码示例中,我指定要在 JedisConnectionException 上重试,每次重试之间的延迟应为 1000 毫秒,并且延迟应呈指数增长。

使用 @Retryable 注解,我们可以使用重试退避 backoff 属性,还可以指定每次重试之间的延迟 delay。

3.外部化重试配置

我们可以轻松地将重试配置外部化到属性文件中。当我们想要重用配置并更改它们而无需重新部署应用程序时,这非常有用。就我而言,我创建了一个 retry.properties 文件并添加了以下属性:

retry.maxAttempts=2

在我的 spring 配置中包含属性文件:

// <<Other annotations>>
@PropertySource("classpath:retryConfig.properties")
public class ApplicationConfig { }

以下图片是一个先获取 MySql 连接,再查数据的例子,我再代码中使用了该外部化配置属性:

4.消除错误时的重复操作,使用 RetryListenerSupport 重试

在前面的先获取 MySql 连接,再查数据的例子中,我想获取以下事件的指标:

  • 连接 MySql 数据库时,发出指标
  • 连接 MySql 数据库失败时,发出指标
  • 当用尽所有重试次数时,发出指标
再 Spring Retry 中,我可以使用 RetryListenerSupport 将所有代码添加到一个位置,而不是在连接到 Mysql 数据库的所有代码的每个重试块中添加相同的代码。

使用 RetryTemplate 上的 registerListener 方法注册 RetryListenerSupport:

@Configuration
public class ApplicationConfig {@Beanpublic RetryTemplate installTemplate() {RetryTemplate retryTemplate = new RetryTemplate();retryTemplate.registerListener(new DefaultListenerSupport());return retryTemplate;}
}

RetryListenerSupport 提供了三种方法,我们可以重写它们来添加自定义逻辑:

  • onError — 当出现错误时调用此方法
  • close——当所有重试都用尽时调用该方法
  • open — 重试开始时调用该方法

现在让我们看看重构后的代码:

总结

在本文中,我们了解了如何使用 Spring Retry 来减少样板代码并使代码更具可读性和可维护性。通过 Spring Retry,相信你也能够消除超过 1000 行代码。

相关文章:

我是如何使用Spring Retry减少1000 行代码

使用 Spring Retry 重构代码的综合指南。 问题介绍 在我的日常工作中&#xff0c;我主要负责开发一个庞大的金融应用程序。当客户发送请求时&#xff0c;我们使用他们的用户 ID 从第三方服务获取他们的帐户信息&#xff0c;保存交易并更新缓存中的详细信息。尽管整个流程看起来…...

ARM开发(stm32 cortex-A7核IIC实验)

1.实验目标&#xff1a;采集温湿度传感器值&#xff1b; 2.分析框图&#xff08;模拟IIC控制器&#xff09;&#xff1b; 3.代码&#xff1b; ---iic.h封装时序协议头文件--- #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "st…...

「Java」《Java集合框架详解:掌握常用集合类,提升开发效率》

Java集合框架详解&#xff1a;掌握常用集合类&#xff0c;提升开发效率 摘要&#xff1a;一. 引言二. 集合框架概述三. 集合接口详解四. 集合类的选择五. 泛型和类型安全六. 集合的线程安全七. 高级集合类和算法八、Java集合实践操作示例1. 创建和初始化集合&#xff1a;2. 遍历…...

游戏出海需知:Admob游戏广告变现策略

越来越多的出海游戏公司更加重视应用内的广告变现&#xff0c;而 AdMob因为其提供的丰富的广告资源&#xff0c;稳定平台支持&#xff0c;被广泛接入采用。 Admob推出的广告变现策略包括bidding、插页式激励视频、开屏广告、各种细分功能的报告等等。 一、Bidding 竞价策略 …...

【linux】NFS调试总结

文章目录 00. ENV10. 简述20. 下载、安装、配置30. 使用1. 从uboot中设置NFS启动文件系统2. 调试 80. 问题1. NFS版本不匹配问题 90. 附件91. 服务端NFS配置项简述 00. ENV ubuntn1804 10. 简述 百度百科&#xff1a;https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E6%96%87…...

wireshark进行网络监听

一、实验目的&#xff1a; 1&#xff09;掌握使用CCProxy配置代理服务器&#xff1b; 2&#xff09;掌握使用wireshark抓取数据包&#xff1b; 3&#xff09;能够对数据包进行简单的分析。 二、预备知识&#xff1a; 包括监听模式、代理服务器、中间人攻击等知识点&#xf…...

时间复杂度

一、时间复杂度 时间复杂度是计算机科学中用来衡量算法运行时间随输入规模增加而增长的速度。简单来说&#xff0c;它是一个衡量算法执行效率的指标&#xff0c;表示算法运行所需时间与输入数据量之间的关系。 时间复杂度通常用大O符号&#xff08;O&#xff09;来表示&#…...

Unity实现广告滚动播放、循环播放、鼠标切换的效果

效果&#xff1a; 场景结构&#xff1a; 特殊物体&#xff1a;panel下面用排列组件horizent layout group放置多个需要显示的面板&#xff0c;用mask遮罩好。 using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; using Unity…...

LangChain + Streamlit + Llama:将对话式AI引入本地机器

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 什么是LLMS&#xff1f; 大型语言模型 &#xff08;LLM&#xff09; 是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的…...

Python 读写 Excel 文件库推荐和使用教程

文章目录 前言Python 读写 Excel 库简介openpyxl 处理 Excel 文件教程pandas 处理 Excel 文件教程总结 前言 Python 读写 Excel 文件的库总体看还是很多的&#xff0c; 各有其优缺点&#xff0c; 以下用一图总结各库的优缺点&#xff0c; 同时对整体友好的库重点介绍其使用教程…...

“深入解析JVM:理解Java虚拟机的工作原理和优化技巧“

标题&#xff1a;深入解析JVM&#xff1a;理解Java虚拟机的工作原理和优化技巧 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理和优化技巧。我们将从JVM的基本结构开始&#xff0c;逐步介绍其工作原理&#xff0c;并提供一些实际示例代码&am…...

解决SEGGER Embedded Studio无法显示Nordic MCU外设寄存器问题

如果使用SES调试NRF52840的时候发现&#xff0c;官方例程只能显示CPU寄存器&#xff0c;但是无法显示外设寄存器时&#xff0c;解决办法如下&#xff1a; 1.在解决方案右键→Options→Debug→Debugger&#xff0c;然后Target Device选择正确的型号。 2.Register Definition Fil…...

Oracle-day1:scott用户、查询、取整、截取、模糊查询、别名——23/8/23

整理一下第一天软件测试培训的知识点 1、scott用户 -- 以system管理员登录锁定scott用户 alter user scott account lock;-- 以system管理员登录解锁scott用户 alter user scott account unlock;-- 以system管理员用户设置scott用户密码 alter user scott identfied by tiger…...

stm32之3.key开关

假设key电阻为40kΩ&#xff0c;则key0 的电压3.3v*4/52.64v 2.key开关代码 ② GPIO_OType_PP//推挽输出 GPIO_OType_PP//开漏输出 推挽输出是指输出端口可以同时提供高电平和低电平输出&#xff0c;而开漏输出则是指输出端口只能提供低电平输出&#xff0c;高电平时需要借…...

GPT带我学-设计模式-代理模式

什么是代理模式 代理模式&#xff08;Proxy Pattern&#xff09;是设计模式中的一种结构型模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。 代理模式有三个主要角色&#xff1a;抽象主题&#xff08;Subject&#xff09;、真实主题&#xff08;Real Subje…...

VMware Workstation Pro 无法使用开机状态下拍的快照来克隆虚拟机,怎么解决?

环境: VMware Workstation Pro16.0 Win10 专业版 问题描述: VMware Workstation Pro有台虚拟机在开机状态下拍了个6.7快照这个win10初始版,现在想在这个快照下直接克隆,无法使用开机状态下拍的快照创建克隆 解决方案: 1.关闭当前虚拟机 2.到虚拟机文件夹复制一份Wind…...

【JAVA】XML及其解析技术、XML检索技术、设计模式

XML XML(Extensible Markup Language)是可扩展标记语言的缩写&#xff0c;它是一种数据表示格式&#xff0c;可以描述复杂的数据结构&#xff0c;常用于传输和存储数据 作用&#xff1a; 用于进行存储数据和传输数据作为软件的配置文件 第一行是文档声明 <?xml version&q…...

Ansible 自动化安装软件

例子如下&#xff1a; 创建一个名为/ansible/package.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 --- - name:…...

简单介绍 React Native 整合 Formik 实现表单校验

Formik 是 React 和 React Native 开源表单库&#xff0c;Formik 负责处理重复且烦人的事情——跟踪值/错误/访问的字段、编排验证和处理提交——所以您不必这样做。而简化字段校验的话我们可以使用yup工具来实现。 首先安装Formik 和 Yup npm i formik npm i yupFormik 与 R…...

蓝帽杯半决赛2022

手机取证_1 iPhone手机的iBoot固件版本号:&#xff08;答案参考格式&#xff1a;iBoot-1.1.1&#xff09; 直接通过盘古石取证 打开 取证大师和火眼不知道为什么都无法提取这个 手机取证_2 该手机制作完备份UTC8的时间&#xff08;非提取时间&#xff09;:&#xff08;答案…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...