当前位置: 首页 > news >正文

Spring-Retry 框架实战经典重试场景

Spring-Retry框架是Spring自带的功能,具备间隔重试包含异常排除异常控制重试频率等特点,是项目开发中很实用的一种框架。

1、引入依赖

坑点:需要引入AOP,否则会抛异常。

 

xml

<!-- Spring-Retry -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<!-- Spring-AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、启动类注解

坑点:很容易一时疏忽忘记启动类开启@EnableRetry,大家别忘了哦。

 

java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;

@SpringBootApplication
@EnableRetry
public class SpringRetryDemoApplication {

public static void main(String[] args) {
SpringApplication.run(SpringRetryDemoApplication.class, args);
}

}

3、模拟发短信

我们模拟一个发短信功能,根据随机数分别作为成功、失败、抛出各种异常的入口。

这里抛出几种异常的目的,是为了后面演示出重试注解参数产生的效果。

 

java

import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;

/**
* <p>
* 短信服务工具类
* </p>
*
*/
@Slf4j
public class SmsUtil {

/**
* 发送短信
*/
public static boolean sendSms() {

// 使用随机数模拟重试场景
int num = RandomUtil.randomInt(4);
log.info("[SmsUtil][sendSms]>>>> random num = {}", num);

return switch (num) {
case 0 ->
// 模拟发生参数异常
throw new IllegalArgumentException("参数有误!");
case 1 ->
// 模拟发生数组越界异常
throw new ArrayIndexOutOfBoundsException("数组越界!");
case 2 ->
// 模拟成功
true;
case 3 ->
// 模拟发生空指针界异常
throw new NullPointerException();
default ->
// 未成功则返回false
false;
};

}
}

4、Retry应用

我们单独写一个用于重试调用的组件类,用于业务类调用。

 

java

import com.example.springretrydemo.util.SmsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
* <p>
* 重试组件
* </p>
*
*/
@Slf4j
@Component
public class RetryComponent {

/**
* 重试机制发送短信
*/
@Retryable(
retryFor = {IllegalArgumentException.class, ArrayIndexOutOfBoundsException.class},
noRetryFor = {NullPointerException.class},
maxAttempts = 4,
backoff = @Backoff(delay = 2000L, multiplier = 2)
)
public boolean sendSmsRetry() {

log.info("[RetryComponent][sendSmsRetry]>>>> 当前时间:{}", getNowTime());
return SmsUtil.sendSms();
}

/**
* 兜底方法,规则:
* 1、超出了最大重试次数;
* 2、抛出了不进行重试的异常;
*/
@Recover
public boolean recover() {
log.info("[RetryComponent][recover]>>>> 短信发送次数过多,请稍后重试!");
return false;
}

/**
* 获取当前时间
*/
private String getNowTime() {

return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}


@Retryable注解参数说明:

图片

@Recover注解说明:用于兜底,当 超出了最大重试次数 或 抛出了不进行重试的异常 时,直接执行该注解声明的兜底方法。

图片

图片

图片

图片

图片

图片

图片

总结

Spring-retry框架还是挺实用的,但不是万能的。

所以,使用这个框架,一定要明确好场景再使用,我这里不推荐复杂场景下使用,因为君子不立于危墙之下

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

http://www.lryc.cn/news/411911.html

相关文章:

  • 人工智能在医疗领域的应用与挑战
  • Windows下nmap命令及Zenmap工具的使用方法
  • 深入了解-什么是CUDA编程模型
  • 111111111111111111
  • 环境如何搭建部署Nacos
  • 什么是 5G?
  • 优化冗余代码:提升前端项目开发效率的实用方法
  • SpringCloud Alibaba 微服务(四):Sentinel
  • Python 3.12新功能(1)
  • c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题
  • Android笔试面试题AI答之Activity常见考点
  • RK3568笔记四十九:W25Q64驱动开发(硬件SPI1)
  • TypeScript 定义不同的类型(详细示例)
  • [工具推荐]前端加解密之Burp插件Galaxy
  • 课题项目结题测试的作用
  • 中国工商银行长春分行开展“工驿幸福 健康财富”长辈客群康养活动
  • 机器学习 第十四章
  • 未来RPA财税的发展前景
  • 快速设置 terminator 透明背景
  • Redis+Unity 数据库搭建
  • WebTracing:如何使用一款SDK实现前端全链路监控
  • 【Story】编程迷航:从 “ 我怎么才学会 ? ” 到 “ 我怎么这么厉害 ! ”
  • 基于“日志审计应用”的 DNS 日志洞察实践
  • 大学按照学科类别、办学层次、教育性质分类有哪些?创龙教仪一文带您了解
  • 数据结构与算法 - 递归
  • python:plotly 网页交互式数据可视化工具
  • 聊一聊 webpack5性能优化有哪些?
  • 公布一批神马爬虫IP地址,真实采集数据
  • uni-app全局文件与常用API
  • 连接器表面缺陷检测方案