优雅永不过时: spring-retry 重试框架

news2024/12/23 16:44:30

文章目录

  • 前言
  • 一、幂等性是重试的前提
  • 二、使用步骤
    • 1.引入依赖
    • 2.启动类或配置类上添加@EnableRetry,启用retry框架
    • 3.创建一个要重试的方法
    • 4.自定义一个retry监听
    • 5.创建一个测试类
  • 总结


前言

Spring Retry 是一个用于在 Spring 应用中实现重试机制的库。它提供了一种方便的方式来处理可能因各种原因失败的操作,并在失败时进行重试。一般可以用于: rpc重试, 数据同步等类似问题;


一、幂等性是重试的前提

确保操作的幂等性是使用Spring Retry的重要前提之一,可以避免系统在面对重复请求或操作时产生不一致的状态或结果。

幂等性是指: 同一个资源的多个请求在业务逻辑上具有相同的结果。

如何保证接口幂等性

二、使用步骤

1.引入依赖

由于是通过aop实现的,所以除了引入retry之外,还要引入aop

 <dependency>
     <groupId>org.springframework.retry</groupId>
      <artifactId>spring-retry</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
  </dependency>

2.启动类或配置类上添加@EnableRetry,启用retry框架

代码如下(示例):

@SpringBootApplication
@MapperScan("com.auth.token.dao*")
@EnableRetry
public class TokenApplication {
    public static void main(String[] args) {
        SpringApplication.run(TokenApplication.class, args);
    }
}

3.创建一个要重试的方法

代码如下(示例):

@Service
public class RetryServiceImpl implements RetryService {


    /**
     * {@link Retryable} 注解,加在接口方法和实现类方法上都能实现相同的重试功能
     * <p>
     * 区别如下:
     * <li>加在接口方法: 那么所有实现类都是统一的行为,都重试</li>
     * <li>加在实现类方法上: 那么只有该类会执行重试</li>
     * <p/>
     */
    @SneakyThrows
    @Override
    @Retryable(value = Exception.class, maxAttempts = 3, listeners = {"retryListenerDemo"})
    public void exceptionMethod() {
        System.out.println("开始执行");
        throw new Exception("抛出异常");
    }

    /**
     * 重试失败后,此方法用于执行恢复
     * <p>此方法必须为void 且需要与重试方法{@link RetryServiceImpl#exceptionMethod}所在同一个类中</p>
     */
    @Recover
    public void recoverMethod() {
        System.out.println("执行恢复");
    }

}
  1. value 哪些异常要重试
  2. maxAttempts 最大重试次数,包括请求的那次,默认就是3
  3. listeners 监听类的名称,可以是多个
  4. backoff 可以设置重试间隔

4.自定义一个retry监听

代码如下(示例):

/**
 * 自定义的 retry-listener
 */
@Component
public class RetryListenerDemo implements RetryListener {

    @Override
    public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
        System.out.println(context.getRetryCount());
        context.setAttribute("a", "我是Retry上下文中存入的数据");
        System.out.println("listener>>>开始监听");
//        return false; // 否决整个重试
        return true; // 继续重试
    }

    @Override
    public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        System.out.println(context.getAttribute("a"));
        System.out.println("listener>>>关闭");
    }

    @Override
    public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        System.out.println("listener>>>报错了");
    }
}

5.创建一个测试类

代码如下(示例):

@SpringBootTest
class RetryServiceTest {

    @Autowired
    RetryService retryService;

    @Test
    void exceptionMethod() {
        retryService.exceptionMethod();
    }
}

打印结果如下:
运行结果


总结

  • 可以看到,当抛出异常后,retry框架开始重试执行,然后三次失败后,执行了恢复方法;
  • 当在重试过程中,开始重试,每次报错,到最后一次重试关闭,每次都可以监听到,并可以在监听中自定义参数,并读取到;

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

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

相关文章

AOP(面向切面编程)基于XML方式配置

概念解释&#xff1a;&#xff08;理解基本概念方可快速入手&#xff09; 连接点&#xff08;joinpoint&#xff09; 被拦截到的点&#xff0c;因为Spring只支持方法类型的连接点&#xff0c;所以在Spring中连接点指的就是被拦截到的方法。 切入点&#xff08;pointcut&#x…

在电商狂欢中,什么平台更加对商家有利?

我是电商珠珠 近年来&#xff0c;不管是直播电商也好&#xff0c;电商平台也好&#xff0c;都一直朝着向上走的趋势。 我做电商也已经有5年时间了&#xff0c;期间做过天猫&#xff0c;快手、抖店&#xff0c;团队从原来的几个人&#xff0c;扩大到了70。 在22年10月&#x…

使用ObjectARX事务功能做小动画处理

使用ObjectARX事务功能做小动画处理&#xff0c;可以用于几何算法调试等 void CmdFun::Test() {if (true){ads_point pt;ads_name en;if (RTNORM ! acedEntSel(_T("\n选中对象 : "), en, pt))return;AcDbObjectId id;if (Acad::eOk ! acdbGetObjectId(id, en))retur…

哈尔滨爆火的背后有什么值得我们学习的,2024普通人如何创业/2024风口行业

这个冬天&#xff0c;“南方小土豆”带火东北冰雪游。“冰城”黑龙江哈尔滨的文旅市场异常火爆&#xff0c;元旦假期3天&#xff0c;哈尔滨市累计接待游客304.79万人次&#xff0c;实现旅游总收入59.14亿元。旅游总收入达到历史峰值。哈尔滨旅游怎么就爆火了&#xff1f;背后究…

鸿蒙学习笔记

DevEco Studio, ArkTS, ArkUI, ArkCompiler, DevEco Testing是啥 DevEco Studio是华为开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发基于华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;的应用程序。它提供了丰富的开发工具和功能&#xff0c;包…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK修改图像像素格式Mono8或者Mono10(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK修改图像像素格式Mono8或者Mono10&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的图像像素格式的技术背景CameraExplorer如何查看修改相机图像像素格式信息在NEOAPI SDK里通过函数修改图像像素格式修改像素格式测试演…

微信小程序启用组件按需注入

微信小程序在预览或上传的时候会进行代码质量检测&#xff0c;有时候会提示‘组件需按需注入’&#xff0c;如下图所示&#xff1a; 这是只要加一句代码"lazyCodeLoading": "requiredComponents" 就行了 &#xff0c;添加的位置在app.json文件的里面&#…

【linux】lsblk和df -h显示的磁盘信息不同

【问题分析】 lsblk 查看的是block device,也就是逻辑磁盘大小。 df查看的是file system, 也就是文件系统层的磁盘大小。 这种情况应该是block device容量变大&#xff0c;单还没有反映到file system中。 【问题解决】 如果是ext{2,3,4}文件系统的话&#xff0c;可以用res…

中断产生流程

中断产生流程 中断向量表 entry.S (arch\arm64\kernel) ENTRY(vectors) kernel_ventry 1, sync_invalid // Synchronous EL1t kernel_ventry 1, irq_invalid // IRQ EL1t kernel_ventry 1, fiq_invalid // FIQ EL1t …

linux中最常用的用户信息命令

文章目录 linux中最常用的用户信息命令还有谁 last语法一般使用方法查看最近登陆的三个用户省略hostname显示最后一列显示主机IP地址 我是谁 whoami谁&#xff1f;who默认使用系统的运行时间显示表头信息显示登录的人员及总数 什么&#xff1f;谁&#xff1f;w (who & what…

如何理解Transformer论文中的positional encoding,和三角函数有什么关系?

大家好&#xff0c;我分享交流下这个问题。 Positional Encoding 掏出一张被无数人讲述的架构图。 Transformer 模型中的位置编码&#xff08;Positional Encoding&#xff09;是为了让模型能够考虑单词在句子中的位置。 由于 Transformer 的自注意力&#xff08;Self-Atte…

(适趣AI)Vue笔试题

&#x1f4d1;前言 本文主要是【Vue】——&#xff08;适趣AI&#xff09;Vue笔试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

Sqlmap参数设置

Sqlmap参数设置 &#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; --------------------------------------------注意---------…

设计模式Java实战,彻底学会

​这是全网最强的Java设计模式实战教程。此教程用实际项目场景&#xff0c;结合SpringBoot&#xff0c;让你真正掌握设计模式。 网址是&#xff1a;Java设计模式实战专栏介绍 - 自学精灵&#xff08;也可以百度搜索“自学精灵”&#xff09;。 本设计模式专栏的威力 用Java实…

将有序数组转换为二叉搜索树[简单]

一、题目 给你一个整数数组nums&#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5…

nginx下日志配置和排查错误

目录 一&#xff1a;配置 二&#xff1a;排查日志 一&#xff1a;配置 在Nginx中&#xff0c;日志配置是记录服务器活动和排查问题的重要环节。以下是一些常见的Nginx日志配置选项&#xff1a; 日志级别&#xff1a;通过设置日志级别&#xff0c;可以控制日志的详细程度。常…

数据结构和算法-交换排序中的冒泡排序(过程 代码实现 算法效率 稳定性 适用链表?)

文章目录 总览冒泡排序冒泡&#xff1f;啥是冒泡排序冒泡排序过程算法实现算法性能分析稳定性冒泡排序是否适用于链表 小结 总览 冒泡排序 冒泡&#xff1f; 自然界的冒泡 啥是冒泡排序 冒泡排序过程 此时序列要求递增的 首先比较27和49&#xff0c;发现符号递增序列&…

四个模型建模及数据分析整理(基于Titanic数据集)

目录 介绍&#xff1a; 二、数据 2.1引用数据 2.2检查缺失数据 2.2.1手动检查缺失数据 2.2.2查看某一个特征值为空数据 2.3补充缺失数据 2.3.1盒图 2.3.2手动用均值填补缺失数据 2.3.3手动用类别填补缺失数据 三、数据分析 3.1男女生存比例 3.2男女生存数 3.3船舱级…

红队专题-Web安全/渗透测试-文件上传/下载/包含

文件上传/下载/包含 招募六边形战士队员利用目录穿越反弹SHELL实战测试2.2 提交报文修改检测3.2 文件内容检测绕过完整文件结构 检测 第四章&#xff1a;解析漏洞第一节 常见解析漏洞iis/nginx php fastcgi 取值错误 解析漏洞 &#xff08;配置错误&#xff09;nginx 文件名逻…

19.计数问题

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int res 0;int x sc.nextInt();for(int i1;i<n;i) {String s i "";for(int j0;j<s.length();j) {…