【Spring】SpringRetry重试机制和Spring异步任务发送操作结合应用场景实操,通俗易懂

news2024/11/13 9:29:11

平时调用一些第三方接口或者内部接口,可能出现处理异常或者超时或者意外因素,我们可以使用重试机制来为用户提高体验。

1.引用依赖

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

2.模拟发送短信出现的不同情况

@Slf4j
public class SMSUtilsRetry {

    // 假设并且模拟本方法为发送短信,如果得到的值为1表示正常,其他都不行
    public static boolean sendSMS() {
        int num = RandomUtils.nextInt(0, 4);
        log.info("随机数 num = {}", num);

        switch (num) {
            case 0: {
                // 模拟发生异常,比如参数异常,参数不能为0
                throw new IllegalArgumentException("参数有误,不能为0");
            }
            case 1: {
                // 调用正常并且正确返回
                return true;
            }
            case 2: {
                // 模拟发生错误调用,第三方接口返回的数据不对
                // 数据不对我抛出异常
                throw new ArrayIndexOutOfBoundsException("数组越界");
            }
            case 3: {
                // 调用正常但是第三方返回参数不对,针对false则需要自行处理
                // 第三方sdk一般返回不同的状态码,对照状态码进行处理即可
                return false;
            }

        }

        // 其他则触发其他异常
        throw new NullPointerException("空指针");
    }
}

3.构建重试组件

@Slf4j
@Component
public class RetryComponent {

    // 实现重试机制,提供重试能力
    @Retryable(include = {
                       IllegalArgumentException.class,
                       ArrayIndexOutOfBoundsException.class},   // 指定重试的异常,不是这个异常则不重试
                //exclude=NullPointerException.class, //指定不重试的异常,抛出这个异常则不重试
                maxAttempts = 5,
                backoff = @Backoff(
                        delay = 100L,
                        multiplier = 2)   // 重试间隔为1秒,后续重试为次数的2倍,第1次1秒,第2次2秒,第3次4秒
    )
    public boolean sendSMSWithRetry() {
        log.info("当前时间 Time = {}", LocalDateTime.now());
        return SMSUtilsRetry.sendSMS();
    }

    // 达到最大重试次数,或者抛出了一个没有进行重试的异常
    // 可以作为方法的兜底处理,如果不处理,可以随意
    @Recover
    public boolean recover() {
        GraceException.display(ResponseStatusEnum.SYSTEM_SMS_FALLBACK_ERROR);
        return false;
    }
}
  • @Retryable(value = {Exception.class}, 所有异常都被拦截
    也可以指定(同include)
  • @Retryable的value如果指定了异常,按摩如果抛出的异常没有被指定,则进入兜底方法(同include)
  • exclude排除某个异常,改异常不重试

   @Retryable含有很多属性点进去看源码发现多种功能

4.来吧让我们发送一下短信试试看

@Slf4j
@SpringBootTest
public class SpringRetryTest {

    @Autowired
    private RetryComponent retryComponent;

    @Test
    public void retry() {
        boolean result = retryComponent.sendSMSWithRetry();
        log.info("运行最终结果为result = {}", result);
    }

}

5.enable开启retry功能

怎么实现重试机制,那么可以采用spring-retry或者guava-retry,假设进你这个不准用,怎么办?可以使用消息队列的延迟机制

6应用

  • 同步任务就是顺序的去执行任务,前面的任务没有执行完,后面的任务只能等待前面结束了才能继续,会被卡着,就跟堵车一样。而异步任务则不一样,它可以多个任务并行执行
  • 异步任务优点:
    1. 减少主流程的执行时间,避免主业务被长时间阻塞,提升用户的体验,也提升服务器处理请求的吞吐量。
    2. 避免分支业务处理失败而导致整个请求的最终失败,什么意思呢,举个例子:用户下单付款之后,平台会赠送积分、记录日志等等,这些并不是主要流程中的业务,主要业务功能是支付下单,所以整个过程可以放到异步任务或者消息队列中去完成,分支任务执行失败也没有关系,不会影响整个流程的功能。所以异步任务适用于处理log、发送邮件、短信等
  • 同步任务就是顺序的去执行任务,前面的任务没有执行完,后面的任务只能等待前面结束了才能继续,会被卡着,就跟堵车一样。而异步任务则不一样,它可以多个任务并行执行
  • 异步任务优点:
    1. 减少主流程的执行时间,避免主业务被长时间阻塞,提升用户的体验,也提升服务器处理请求的吞吐量。
    2. 避免分支业务处理失败而导致整个请求的最终失败,什么意思呢,举个例子:用户下单付款之后,平台会赠送积分、记录日志等等,这些并不是主要流程中的业务,主要业务功能是支付下单,所以整个过程可以放到异步任务或者消息队列中去完成,分支任务执行失败也没有关系,不会影响整个流程的功能。所以异步任务适用于处理log、发送邮件、短信等

7Spring异步任务发送短信

启动类开启异步任务:

创建异步组件:

调用异步任务,并且观察日志结果:

异步任务与消息队列 

在微服务中,异步任务放入到api服务模块中里,两点不好,一个是大量业务在api中共用工程,异步任务更偏向业务,第二个,本质上项目没有做到解耦,打包还是在一起的。而mq可以用一个专有的短信监听服务,用消息队列一个一个去处理,专门异步发送所有短信场景,这才是比较 ok的方式

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

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

相关文章

【单片机毕业设计选题24079】-基于单片机的室内通风系统

系统功能: 系统分为手动和自动模式&#xff0c;上电默认为自动模式&#xff0c;自动模式下系统根据采集到的传感器值 自动控制&#xff0c;温度过低后自动开启加热&#xff0c;湿度过低后自动开启继电器加湿&#xff0c;获取到烟雾值大于设定值或获取到的CO值大于设定的CO值时…

视图,存储过程和触发器

目录 视图 创建视图&#xff1a; 视图的使用 查看库中所有的视图 删除视图 视图的作用&#xff1a; 存储过程&#xff1a; 为什么使用存储过程&#xff1f; 什么是存储过程&#xff1f; 存储过程的创建 创建一个最简单的存储过程 使用存储过程 删除存储过程 带参的存储…

【已解决 Python】 TypeError: can only concatenate list (not “int”) to list

【已解决 Python】 TypeError: can only concatenate list (not “int”) to list 在Python编程中&#xff0c;TypeError: can only concatenate list (not "int") to list是一个常见的错误。此错误表明你尝试将一个整数&#xff08;int&#xff09;与列表&#xff…

初识redis:通用命令

今天我们简单介绍一些关于redis的基础命令。 目录 get 和 set 全局命令 keys EXISTS del&#xff08;delete&#xff09; expire TTL Redis的key过期策略是怎么实现的&#xff1f; type get 和 set 连接到云服务器后&#xff0c;通过redis-cli命令进入到redis客户端…

7月21日读Neuroimage Denoiser

Neuroimage Denoiser for removing noise from transient 1 fluorescent signals in functional imaging. Summary Neuroimage Denoiser&#xff0c;这是一种新型的基于U-Net的模型&#xff0c;可以有效去除显微镜记录中瞬时局部荧光信号的噪声。该模型使去噪过程与记录频率和…

sql注入 mysql 执行命令 sql注入以及解决的办法

我们以前很可能听过一个词语叫做SQL注入攻击&#xff0c;其是威胁我们系统安全的最危险的因素之一&#xff0c;那么到底什么是SQL注入攻击呢&#xff1f;这里我会用一个最经典最简单的例子来跟大家解释一下&#xff1a; 众所周知&#xff0c;我们的sql语句都是有逻辑的&#xf…

Python爬虫:代理ip电商数据实战

引言&#xff1a;数据访问管理引发的烦恼 作为一名Python博主&#xff0c;爬虫技能对于获取和分析数据至关重要&#xff0c;经常爬一下&#xff0c;有益身心健康嘛。爬虫技术对很多人来说&#xff0c;不仅仅是一种工具&#xff0c;更像是一种艺术&#xff0c;帮助我们从互联网…

大模型入门学习笔记(非常详细)零基础入门到精通,收藏这一篇就够了

一、认识大模型 1.1 从人工智能到大模型的演变 学完本文后&#xff0c;你将能够&#xff1a; 掌握大模型的特点、重要概念以及工作方式 了解大模型的基本概况和产品矩阵 了解大模型&#xff0c;尤其是大语言模型的应用场景和示例 大模型是人工智能领域的一个重要里程碑&a…

C++相关概念和易错语法(23)(set、仿函数的应用、pair、multiset)

1.set和map存在的意义 &#xff08;1&#xff09;set和map的底层都是二叉搜索树&#xff0c;可以达到快速排序&#xff08;当我们按照迭代器的顺序来遍历set和map&#xff0c;其实是按照中序来遍历的&#xff0c;是排过序的&#xff09;、去重、搜索的目的。 &#xff08;2&a…

展馆导览系统架构解析,从需求分析到上线运维

在物质生活日益丰富的当下&#xff0c;人们对精神世界的追求愈发强烈&#xff0c;博物馆、展馆、纪念馆等场所成为人们丰富知识、滋养心灵的热门选择。与此同时&#xff0c;人们对展馆的导航体验也提出了更高要求&#xff0c;展馆导览系统作为一种基于室内外地图相结合的位置引…

STM32智能农业监测与控制系统教程

目录 引言环境准备智能农业监测与控制系统基础代码实现&#xff1a;实现智能农业监测与控制系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业监测与优化问题解决方案与优化收尾与总结 1. 引言 智能农…

电脑基础知识 | 电脑的基本组成

电脑作为我们日常工作和娱乐的重要工具&#xff0c;扮演着举足轻重的角色。当我们谈论电脑的基本组成时&#xff0c;其实是在探讨电脑硬件和软件两个核心部分。硬件是电脑看得见、摸得着的物理设备&#xff0c;而软件则是运行在这些硬件之上的程序和指令。两者相辅相成&#xf…

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport&#xff0c;包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等&#xff0c;用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象&#xff0c;是 mediasoup 最重要…

Electron案例解析——切换主题颜色的案例

效果图 核心 Electron的 nativeTheme.themeSource属性&#xff0c;值是string。有三个参数&#xff1a;system, light 和 dark&#xff0c;用来覆盖、重写Chromium内部的相应的值 Election的api描述值nativeTheme.themeSource被用来覆盖、重写Chromium内部的相应的值system, …

swagger-ui.html报错404

问题1&#xff1a;权限受限无法访问 由于采用的Shiro安全框架&#xff0c;需要在配置类ShiroConfig下的Shiro 的过滤器链放行该页面&#xff1a;【添加&#xff1a;filterChainDefinitionMap.put("/swagger-ui.html", "anon");】 public ShiroFilterFact…

springboot失物招领论坛系统-计算机毕业设计源码56603

目 录 1 绪论 1.1 研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程…

QT 信号槽机制

核心函数为 QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type Qt::AutoConnection) 参数为 1.信号发生对象 2.信号发生对象的信号 3.槽对象 4.槽对象的槽函…

CAD框架介绍

1、适用范围&#xff1a;矢量编辑软件如 服装模板软件、CAD软件、绘图软件 2、支持PLT,DXF,PDF,GCode&#xff08;服装裁割指令)等矢量文件导入 3、支持简易的自动手动排料 4、直线&#xff0c;曲线等编辑功能 5、分页输出绘图指令 6、良好的框架结构&#xff1a;绘图引擎…

单向链表

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

员工网络监控软件:把控员工网络活动的标尺

在竞争激烈的漩涡之中&#xff0c;企业如同一只不断旋转的陀螺&#xff0c;努力保持着自身的平衡和稳定&#xff0c;而员工的网络活动则是那无形却强大的力量&#xff0c;时刻影响着企业的运转。员工网络监控软件仿佛一根坚固无比的轴心&#xff0c;以其精准的标尺帮助企业实现…