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

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

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: {// 模拟发生异常,比如参数异常,参数不能为0throw 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();}// 达到最大重试次数,或者抛出了一个没有进行重试的异常// 可以作为方法的兜底处理,如果不处理,可以随意@Recoverpublic 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 {@Autowiredprivate RetryComponent retryComponent;@Testpublic 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.mzph.cn/diannao/49531.shtml

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

相关文章

单片机学习(18)--红外遥控器

红外遥控器 17.1红外遥控的基础知识1.红外遥控简介2.硬件电路3.基本发送和接收4.NEC编码5.遥控器键码6.51单片机的外部中断7.外部中断寄存器 17.2红外遥控的程序代码1.红外遥控&#xff08;1&#xff09;工程目录&#xff08;2&#xff09;main.c函数&#xff08;3&#xff09;…

vue 实战 tab标签页+el-card+流式布局+异步接口调用

<template><div><!-- 布局按钮 --><el-button click"dialogVisible true">布局配置查看</el-button><!-- 布局配置对话框 --><el-dialog :visible.sync"dialogVisible" title"布局配置查看" width"…

Invalid bound statement (not found)

Invalid bound statement (not found) 首先申明的是这个错误一般是使用mybatis方法没有找到或者参数不匹配等原因造成的&#xff01; 原本项目是使用eclipse运行&#xff0c;导入到idea之后&#xff0c;项目启动就报错 …Invalid bound statement (not found)… 解决办法&#…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性&#xff0c;可以从以下几个方面着手&#xff1a; 遵守网站的使用条款和服务协议&#xff1a;在爬取数据之前&#xff0c;仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取&#xff0c;哪些不可以。 例如&…

中电金信:AI数据服务

01 方案简介 AI数据服务解决方案为泛娱乐、电子商务、交通出行等行业提供数据处理、数据分析、AI模型训练等服务&#xff0c;通过自主研发的IDSC自动化数据服务平台与客户业务流程无缝衔接&#xff0c;实现超低延时的实时数据处理支持。 02 应用场景 智能医疗&#xff1a; 通…

深入浅出mediasoup—通信框架

libuv 是一个跨平台的异步事件驱动库&#xff0c;用于构建高性能和可扩展的网络应用程序。mediasoup 基于 libuv 构建了包括管道、信号和 socket 在内的一整套通信框架&#xff0c;具有单线程、事件驱动和异步的典型特征&#xff0c;是构建高性能 WebRTC 流媒体服务器的重要基础…

《javaEE篇》--单例模式详解

目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式&#xff0c;设计模式就好比是一种固定代码套路类似于棋谱&#xff0c;是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是&#xff0c;在有…

升级python版本

参考 https://blog.51cto.com/u_15579956/10397535 python3 main.py

聚焦保险行业客户经营现状,概述神策数据 CJO 解决方案

触点红利时代&#xff0c;企业的经营需求从「深度的用户行为分析」转变为「个性化、全渠道一致的客户体验」。客户旅程编排&#xff08;Customer Journey Orchestration&#xff0c;简称 CJO&#xff09;从体验出发&#xff0c;关注客户需求、感受和满意度&#xff0c;能够帮助…

HarmonyOS Next系列之地图组件(Map Kit)使用(九)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

「运费速查神器」精明买家必备!一键查询1688供应商发货费用

对于从事跨境买家还是国内电商买家&#xff0c;在选品时&#xff0c;需要全面考虑商品成本&#xff0c;发货费用是供应链成本的重要组成部分。 原来如果我们在1688选品看供应商发货运费&#xff0c;需要一个个单独点击到商品的详情页去查看&#xff0c;再选择具体的收货地、再…

Elastic:监控不同于可观察性的 3 个原因

作者&#xff1a;来自 Elastic Observability Team 监控和可观察性经常互换使用&#xff0c;但它们并不完全相同。监控是可观察性的重要组成部分&#xff0c;但可观察性远远超出了传统监控实践的范围。 关键区别&#xff1a;监控从各个组件收集数据 —— 何时和什么&#xff0…

微信小程序-CANVAS写入图片素材、文字等数据生成图片

微信小程序中&#xff0c;CANVAS写入图片素材、文字等数据生成图片&#xff0c;最终可将生成的 base64 格式图片保存至相册操作 Tips&#xff1a; 1、canvas 标签默认宽度 300px、高度 150px canvas 生成图片时&#xff0c;写入图片素材、文字等数据前&#xff0c;需要根据实…

叶再豪降龙精英课程总结

文章目录 1.思维认知1.1 稻盛和夫成功公式1.2 龙头主升模式1.3 龙头主升-两种路径1.4 股市新手的炒股思路1.5 龙头案例1.6 降龙心法 2.情绪周期2.1 情绪周期2.1 情绪演绎周期2.2 情绪的四个部分2.2.1 指数的情绪周期2.2.3 热点情绪周期2.2.4 热点情绪演绎周期2.2.5 大热点支线2…

深入了解路由器工作原理:从零开始的简单讲解

简介 在现代网络中&#xff0c;路由器扮演着至关重要的角色。它不仅连接了不同的设备&#xff0c;还确保数据能够准确地传输到目的地。本文将带你深入探讨路由器的工作原理&#xff0c;帮助网络基础小白们理解这一重要设备的基本功能。 路由器的构成 路由器是一种具有多个输入…

纷享AI | AI技术在销售场景的应用与实践

AI高速发展的今天&#xff0c;各行业都经历着深刻变革。但机遇与挑战总相伴相生&#xff0c;各企业负责人事实上也正面临着如何有效利用AI以完成赋能销售业务的难题。 毋庸置疑&#xff0c;跟上技术潮流&#xff0c;通过落实AI在销售场景中的应用进而取得卓越赋能成果必然是行…

Android TabLayout的简单用法

TabLayout 注意这里添加tab&#xff0c;使用binding.tabLayout.newTab()进行创建 private fun initTabs() {val tab binding.tabLayout.newTab()tab.text "模板库"binding.tabLayout.addTab(tab)binding.tabLayout.addOnTabSelectedListener(object : TabLayout.On…

深度学习系列一

激活函数 sigmod 梯度消失问题&#xff1a; sigmoid函数的导数在输入值较大或较小时接近于0。在反向传播过程中&#xff0c;这些小梯度会相乘&#xff0c;导致深层网络的梯度变得非常小。结果是&#xff0c;深层网络的参数几乎不会更新&#xff0c;训练变得非常困难。这就是为…

Passing output of 3DCNN layer to LSTM layer

题意&#xff1a;将3DCNN&#xff08;三维卷积神经网络&#xff09;层的输出传递给LSTM&#xff08;长短期记忆网络&#xff09;层 问题背景&#xff1a; Whilst trying to learn Recurrent Neural Networks(RNNs) am trying to train an Automatic Lip Reading Model using 3…

2024年上半年主要游戏安全风险,该如何应对?

随着游戏行业的蓬勃发展&#xff0c;安全问题也日益成为行业关注的焦点。面对 2024 年上半 年的游戏安全风险挑战&#xff0c;游戏行业需要不断加强技术能力&#xff0c;完善安全策略&#xff0c;与各方共 同努力&#xff0c;打造一个更加安全、公平的游戏环境。 游戏安全解…