【AOP进阶】实现重试机制

news2024/11/16 21:22:05

📚目录

    • ⚙️简介:
    • ✨注解定义:
      • ⛳@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 添加测试接口:

    @Resource
    private 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.coloradmin.cn/o/1152182.html

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

相关文章

WSL2 Ubuntu安装CUDA Toolkit

目前CUDA ToolKit需要切换到WSL2&#xff0c;在WLS1下不支持。之前折腾了很久&#xff0c;才从WSL1的坑中爬出来&#xff0c;仅写此文避免大家再从坑里走一次。 Windows WSL2相关 检查正在运行的 WSL 版本 可列出已安装的 Linux 发行版&#xff0c;并通过在 PowerShell 或 W…

Android NDK开发详解之ndk-gdb

Android NDK开发详解之ndk-gdb 要求用法选项 线程支持 NDK 包含一个名为 ndk-gdb 的 Shell 脚本&#xff0c;可以启动命令行原生调试会话。偏好使用 GUI 的用户则应阅读在 Android Studio 中调试这篇文档。 要求 要运行命令行原生调试&#xff0c;必须满足以下要求&#xff1…

SDK 消息处理

目录 消息处理 窗口通知消息处理 鼠标消息 键盘消息 绘图消息 WM_PAINT 客户区与非客户区 WM_PAINT消息 BeginPaint && EndPaint 模仿记事本输入字符功能 定时器 消息处理 窗口的过程函数接收到消息后并且进行处理。平时常用的消息以及官方参考文档&#xf…

“ 1+2+N “打造“北斗+智慧城市”,让城市生活更美好

10月31日是世界城市日。世界城市日是联合国首个以城市为主题的国际日&#xff0c;也是第一个由中国政府倡议并成功设立的国际日&#xff0c;出自2010年10月31日上海世博会高峰论坛上发布的《上海宣言》中的倡议。世界城市日秉承了中国2010年上海世博会“城市&#xff0c;让生活…

前端知识与基础应用#2

标签的分类 关于标签我们可以分为 &#xff1a; 单标签&#xff1a;img, br hr 双标签&#xff1a;a&#xff0c;h,div 按照属性可分为&#xff1a; 块儿标签&#xff08;自己独自占一行&#xff09;&#xff1a;h1-h6, p,div 行内&#xff08;内联&#xff09;标签&#xff08…

【1】C语言实现顺序表

文章目录 Ⅰ 概念及结构1. 静态顺序表2. 动态顺序表 Ⅱ 基本操作实现1. 定义顺序表2. 初始化顺序表3. 销毁顺序表4. 输出顺序表5. 扩容顺序表6. 尾插法插入数据7. 头插法插入数据8. 尾删法删除数据9. 头删法删除数据10. 顺序表查找11. 在指定位置 pos 插入数据12. 删除指定位置…

【算法】动态规划之LeetCode 53.最大子数组和

目录 文章目录 **目录**&#x1f4d1;前言1.题目描述2. 动态规划法 &#x1f4d1;文章末尾 &#x1f4d1;前言 本文主要是leetcode题解析&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁…

联想方案服务斩获CCF技术发明奖,助力云原生技术发展

10月27日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;公布了我国计算机科技领域最具权威性的科技奖项——2023年度“CCF科技成果奖”评选结果&#xff0c;共有41个项目荣获2023年度CCF科技成果奖。由联想集团与上海交通大学等共同研究开发的《面向互联网服务的云原生…

【机器学习合集】模型设计之网络宽度和深度设计 ->(个人学习记录笔记)

文章目录 网络宽度和深度设计1. 什么是网络深度1.1 为什么需要更深的模型浅层学习的缺陷深度网络更好拟合特征学习更加简单 2. 基于深度的模型设计2.1 AlexNet2.2 AlexNet工程技巧2.3 VGGNet 3. 什么是网络宽度3.1 为什么需要足够的宽度 4. 基于宽度模型的设计4.1 经典模型的宽…

错误 LNK1112 模块计算机类型“x64”与目标计算机类型“X86”冲突

这个错误表明你在进行链接时&#xff0c;模块的计算机类型与目标计算机类型冲突。 在这里&#xff0c;“x64”代表64位系统&#xff0c;“X86”代表32位系统。 要解决这个问题&#xff0c;你需要确保你的所有模块&#xff08;包括库文件和依赖项&#xff09;都是与你的目标计…

《算法通关村—队列基本特征和实现问题解析》

《算法通关村—队列基本特征和实现问题解析》 队列的基本特征 队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;具有以下基本特征&#xff1a; 先进先出&#xff08;FIFO&#xff09;&#xff1a;队列中的元素按照它们被添加到队列的顺序排列&#xff0c;…

Matlab论文插图绘制模板第123期—水平正负柱状图

在之前的文章中&#xff0c;分享了很多Matlab柱状图的绘制模板&#xff1a; 进一步&#xff0c;再来看一种特殊的柱状图&#xff1a;水平正负柱状图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下…

人到中年应该怎么交朋友

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

Doris数据库FE——FeServer

FeServer feServer new FeServer(Config.rpc_port);feServer.start();FeServer&#xff08;Doris frontend thrift server&#xff09;职责是负责FE和BE之间通信。如下即为初始化中关于FeServer类的构造函数和start函数的具体代码。其start函数流程和构建thrift server行为一致…

springboot网上商城购物系统

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对网上商城购物系统方面的要求也在不断提高&#xff0c;购物的人数更是不断增加&#xff0c;使得网上商城购物系统的开发成为必需而且…

synchronized 同步锁的思考

经过前面的分析&#xff0c;我们大概对同步锁有了一些基本的认识&#xff0c;同步锁的本质就是实现多线程的互斥&#xff0c;保证同一时刻只有一个线程能够访问加了同步锁的代码&#xff0c;使得线程安全性得到保证。下面我们思考一下&#xff0c;为了达到这个目的&#xff0c;…

毕业工作之后,没有在学校中考试排名这种方式,那如何确定自己是不是一直在退步还是在进步

在职场中衡量自己是否在进步或者退步&#xff0c;相较于学校里通过考试排名来判断要复杂得多。因为职场的评价标准更为多样&#xff0c;同时还涉及到个人职业发展、工作满意度等方面。下面是一些你可以用来判断自己是否在进步的方法&#xff1a; 1. 目标设定与达成 给自己设定…

【数据结构与算法】二叉树基础OJ--下(巩固提高)

前言&#xff1a; 上一篇文章我们讲到二叉树基础oj题目的练习&#xff0c;此篇文章是完成基础oj练习的完结篇。 传送-->【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-CSDN博客 &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388…

分类预测 | Matlab实现SSA-ELM麻雀优化算法优化极限学习机分类预测

分类预测 | Matlab实现SSA-ELM麻雀优化算法优化极限学习机分类预测 目录 分类预测 | Matlab实现SSA-ELM麻雀优化算法优化极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-ELM麻雀优化算法优化极限学习机分类预测&#xff08;Matlab完整…

微信小程序云开发如何实现多条件多字段模糊查询

之前的博文中&#xff0c;已经跟大家介绍过&#xff0c;微信小程序云开发如何实现单条件单字段的模糊查询&#xff0c;这个是很常见的业务需求。在一些更复杂的场景下&#xff0c;我们需要实现多条件多字段的模糊查询&#xff0c;比如同时兼容对商品名称、类别、产地等多条件的…