【AOP进阶】实现重试机制

📚目录

    • ⚙️简介:
    • ✨注解定义:
      • ⛳@RetryMechanism
    • ⌛编写AOP代码:
      • ⚓RetryMechanismAspect 切面
    • ⛵演示:
      • ⛴如何使用@RetryMechanism:
      • ⚡️正常请求如下:
      • ☘️测试异常并且重试:
      • ☄️测试异常并且重试后成功:
    • ✍️结束:

⚙️简介:

      当我们调用第三方服务商接口时,可能存在网络波动导致数据获取异常,得不到我们想要的结果,我们如果想要发起重试,然后又不入侵业务代码,我们使用使用AOP切面技术,通过添加注解方式来实现对应的方法进行重试,代码也很简单。AOP往期文章点击查看

✨注解定义:

     既然使用注解方式那么,我们应该想到注解上应该涉及到那些属性,好比:重试的最次数,发起重试的间隔时间等。

⛳@RetryMechanism

/*** @Author itmei* @Date 2023/10/30 20:07* @description: 重试机制注解* @Title: RetryMechanism*/
//注释的语法位置在方法上
@Target(value = {ElementType.METHOD})
//运行时
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RetryMechanism {/*** 重试次数*/int retryTimes() default 3;/*** 重试间隔时间()*/int retryIntervalSecond() default 10;
}

⌛编写AOP代码:

        AOP的代码使用的是@Around环绕通知,这里面涉及到前置通知,后置通知,异常通知。其中最终通知我们暂且不需要使用到因为它是在finally里面。

在这里插入图片描述

⚓RetryMechanismAspect 切面

/*** @Author itmei* @Date 2023/10/30 20:16* @description: 重试间隔AOP* @Title: RetryMechanismAspect*/
@Aspect
@Order(-99)
@Component
public class RetryMechanismAspect {private final Logger log = LoggerFactory.getLogger(RetryMechanismAspect.class);@Around("@annotation(retryMechanism)")public Object RetryMechanismHandle(ProceedingJoinPoint joinPoint, RetryMechanism retryMechanism) throws InterruptedException {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//拿到方法的注解信息RetryMechanism annotation = methodSignature.getMethod().getAnnotation(RetryMechanism.class);int retryMaxTimes = annotation.retryTimes();int retryIntervalSecond = annotation.retryIntervalSecond();Throwable runtimeException = new RuntimeException();for (int i = 1; i <= retryMaxTimes; i++) {try {//上面的代码是前置通知Object proceed = joinPoint.proceed();//后置通知return proceed;} catch (Throwable throwable) {//异常通知log.warn("调用发生异常,开始重试第{}次", i);runtimeException = throwable;}finally {//最终通知}Thread.sleep(retryIntervalSecond * 1000L);}throw new RuntimeException("重试次数超出限制", runtimeException);}
}

⛵演示:

⛴如何使用@RetryMechanism:

Controller 添加测试接口:

    @Resourceprivate AopService aopService;@RequestMapping("/app/wx")public ResultData wx(String wxid) {return aopService.test(wxid);}

在这里插入图片描述

Service类:
test方法模拟调用第三方的接口因为网络波动导致的超时现象

/*** @Author itmei* @Date 2023/10/30 23:32* @description:* @Title: AopService*/
@Service
public class AopService {/*** 测试方法* 当异常发送后会进行方法重试,并且时间间隔是5秒* @param wxid* @return*/@RetryMechanism(retryTimes = 2,retryIntervalSecond = 5)public ResultData test(String wxid) {//请求第三方接口HttpResponse execute = HttpUtil.createGet("http://localhost:8080?wxid=" + wxid).timeout(3000).execute();if (execute.isOk()) {return ResultData.success(execute.body());}return ResultData.error(execute.body());}
}

在这里插入图片描述

⚡️正常请求如下:

在这里插入图片描述

☘️测试异常并且重试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

☄️测试异常并且重试后成功:

在这里插入图片描述

第一次因为网络波动导致超时,第二次成功拿到返回值

在这里插入图片描述

✍️结束:

     到这里你应该也学习到了使用AOP的环绕通知对代码的无侵入的增强,并且对前置通知,后置通知,异常通知也有了初步的理解,动动手写起来记忆更深刻哦。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu系统HUSTOJ 用 vim 修改php.ini 重启PHP服务

cd / sudo find -name php.ini 输出&#xff1a; ./etc/php/7.4/cli/php.ini ./etc/php/7.4/fpm/php.ini sudo vim /etc/php/7.4/cli/php.ini sudo vim /etc/php/7.4/fpm/php.ini 知识准备&#xff1a; vim的搜索与替换 在正常模式下键入 / &#xff0c;即可进入搜索模式…

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的&#xff1a; 串口屏内部有三个分区&#xff0c;分别为A、B、C三个区&#xff1a; A区&#xff1a;系统区&#xff0c;存储组态工程文件 B区&#xff1a;数据区&#xff0c;存储配置信息&#xff0c;记录数据、历史曲线等 C区&#xff1a;备…

机器学习(python)笔记整理

目录 一、数据预处理&#xff1a; 1. 缺失值处理&#xff1a; 2. 重复值处理&#xff1a; 3. 数据类型&#xff1a; 二、特征工程: 1. 规范化&#xff1a; 2. 归一化&#xff1a; 3. 标准化(方差)&#xff1a; 三、训练模型&#xff1a; 如何计算精确度&#xff0c;召…

数据结构——双向链表的实现

一、双向链表的结构 注意&#xff1a;双向链表又称带头双向循环链表 这⾥的“带头”跟前⾯我们说的“头节点”是两个概念&#xff0c;实际前⾯的在单链表阶段称呼不严 谨&#xff0c;但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表⾥的头节点&#xff0c;实际…

轻量封装WebGPU渲染系统示例<8>- 渲染器基本场景管理(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/RSceneTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5. 用户操作和渲…

浅谈js代码的封装方法(2023.10.30)

常见的js代码封装方法 2023.10.30 需求1、js代码封装的优缺点2、js代码封装方式2.1 方式一&#xff1a;function function declarations2.1.1 示例 2.2 方式二&#xff1a;class2.2.1 class declarations2.2.2 Class expressions 2.3 变量函数2.4 变量闭包匿名函数2.5 闭包函数…

随机链表的复制(C++解法)

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…

基于SpringBoot的垃圾分类管理系统

基于SpringBootVue的垃圾分类管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven主要功能&#xff1a;包括前台和后台两部分、首页列表展示、垃圾分类、垃圾图谱、查看详…

【详细教程】关于如何使用GitGitHub的基本操作汇总GitHub的密钥配置 ->(个人学习记录笔记)

文章目录 1. Git使用篇1.1 下载安装Git1.2 使用Git 2. GitHub使用篇2.1 如何git与GitHub建立联系呢&#xff1f;2.2 配置公钥 1. Git使用篇 1.1 下载安装Git 点击 官网链接 后&#xff0c;进入Git官网&#xff0c;下载安装包 然后根据系统类型进行下载&#xff0c;一般为wind…

Linux 音频驱动实验

目录 音频接口简介为何需要音频编解码芯片&#xff1f;WM8960 简介I2S 总线接口I.MX6ULL SAI 简介 硬件原理图分析音频驱动使能修改设备树使能内核的WM8960 驱动alsa-lib 移植alsa-utils 移植 声卡设置与测试amixer 使用方法音乐播放测试MIC 录音测试LINE IN 录音测试 开机自动…

第16期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

Ceph入门到精通-bluestore IO流程及导入导出

bluestore 直接管理裸设备&#xff0c;实现在用户态下使用linux aio直接对裸设备进行I/O操作 写IO流程&#xff1a; 一个I/O在bluestore里经历了多个线程和队列才最终完成&#xff0c;对于非WAL的写&#xff0c;比如对齐写、写到新的blob里等&#xff0c;I/O先写到块设备上&am…

【操作系统】考研真题攻克与重点知识点剖析 - 第 1 篇:操作系统概述

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

总结之数据分析工具cube.js通过Docker部署

cube.js介绍 官网地址&#xff1a;https://cube.dev/ Cube.js是一个开源的模块化框架&#xff0c;用于构建分析web应用程序。它主要用于构建内部业务智能工具或向现有应用程序添加面向客户的分析。 Cube.js设计用于无服务器查询引擎&#xff0c;如AWS Athena和谷歌BigQuery。…

《HelloGitHub》第 91 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

BI是什么?想要了解BI需要从哪些方面入手?

企业为了执行数字化战略&#xff0c;实行数字化转型&#xff0c;实现数据价值&#xff0c;除了需要相关数字化技术及理念、人才等&#xff0c;还需要借助数字化相关应用&#xff0c;例如商业世界中广受企业欢迎的ERP、OA、CRM等业务信息系统&#xff0c;以及上升势头非常迅猛的…

京东科技埋点数据治理和平台建设实践 | 京东云技术团队

导读 本文核心内容聚焦为什么要埋点治理、埋点治理的方法论和实践、奇点一站式埋点管理平台的建设和创新功能。读者可以从全局角度深入了解埋点、埋点治理的整体思路和实践方法&#xff0c;落地的埋点工具和创新功能都有较高的实用参考价值。遵循埋点治理的方法论&#xff0c;…

nodejs+vue学生考勤综合平台的设计与实现-计算机毕业设计

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。 “学生考勤综合平台”是基于Mysql数据库&#xff0c;在 程序设计的基础上实现的。为确保中国经济的持续发展&#xff0c;信息时代日益更新&#xff0c;蓬勃发展。 因此&#xff0c;国内外技术…

mybatis-plus正确使用姿势:依赖配置、Mapper扫描、多数据源、自动填充、逻辑删除。。。

一、前言 本文基于 springboot、maven、jdk1.8、mysql 开发&#xff0c;所以开始前我们需要准备好这套环境。 1.1 依赖准备 想要什么依赖版本的去 maven 仓库查看&#xff1a;https://mvnrepository.com/ 引入 mybatis-plus 依赖&#xff1a; <dependency><group…

1 — NLP 的文本预处理技术

一、说明 在本文中&#xff0c;我们将讨论以下主题&#xff1a;1为什么文本预处理很重要&#xff1f;2 文本预处理技术。这个文对预处理做一个完整化、程序化处理&#xff0c;这对NLP处理项目中有很大参考性。 二、为什么文本预处理很重要&#xff1f; 数据质量显着影响机器学习…