在实际工作中,重处理是一个非常常见的场景,比如:

发送消息失败。
调用远程服务失败。
争抢锁失败。
这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。

1.POM依赖
基于AOP实现,因此还需引入aop相关的依赖

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

2.启用@Retryable
@EnableRetry
@SpringBootApplication
public class HelloApplication {

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

}

3.在方法上添加@Retryable
1.创建测试controller

@RestController
public class TestRetryController {

@Resource
private TestRetryService testRetryService;

@RequestMapping(value = "/test")
public int test(int code) throws Exception {
return testRetryService.testRetry(code);
}
}

2.创建service接口

public interface TestRetryService {
int testRetry(int code) throws Exception;
}

3.创建service实现类并添加@Retryable

@Service
public class TestRetryServiceImpl implements TestRetryService {

/**
* value:抛出指定异常才会重试
* include:和value一样,默认为空,当exclude也为空时,默认所有异常
* exclude:指定不处理的异常
* maxAttempts:最大重试次数,默认3次
* backoff:重试等待策略,
* 默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000; 以毫秒为单位的延迟(默认 1000)
* multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
* @param code
* @return
* @throws Exception
*/
@Override
@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
public int testRetry(int code) throws Exception{
System.out.println("test被调用,时间:"+ LocalTime.now());
if (code==0){
throw new Exception("情况不对头!");
}
System.out.println("test被调用,情况对头了!");

return 200;
}

/**
* Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法。
* 如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。
* 可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。
* 注意事项:
* 方法的返回值必须与@Retryable方法一致
* 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)
* 该回调方法与重试方法写在同一个实现类里面
*
* 由于是基于AOP实现,所以不支持类里自调用方法
* 如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void
* 方法内不能使用try catch,只能往外抛异常
* @Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。
* @param e
* @param code
* @return
*/
@Recover
public int recover(Exception e, int code){
System.out.println("回调方法执行!!!!");
//记日志到数据库 或者调用其余的方法
System.out.println("异常信息:"+e.getMessage());
return 400;
}
}

来简单解释一下注解中几个参数的含义:

value:抛出指定异常才会重试
include:和value一样,默认为空,当exclude也为空时,默认所有异常
exclude:指定不处理的异常
maxAttempts:最大重试次数,默认3次
backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000(单位毫秒),我们设置为2000;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
当重试耗尽时还是失败,会出现什么情况呢?

当重试耗尽时,RetryOperations可以将控制传递给另一个回调,即RecoveryCallback。Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法。如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。

@Recover
public int recover(Exception e, int code){
System.out.println("回调方法执行!!!!");
//记日志到数据库 或者调用其余的方法
System.out.println("异常信息:"+e.getMessage());
return 400;
}

4.测试效果
这里我们传入的code=0因此走异常的分支,由于我们添加@Retryable注解并设置了相关的参数,程序会按照配置进行重试,重试都失败之后会调用@Recover修饰的方法,最终返回400给浏览器
————————————————
版权声明:本文为CSDN博主「llp1110」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44981526/article/details/125657331

————————————————
原文链接:https://blog.csdn.net/qq_44981526/article/details/125657331

Spring-Retry 重试机制小计的更多相关文章

  1. spring retry 重试机制完整例子

    public static Boolean vpmsRetryCoupon(final String userId) { // 构建重试模板实例 RetryTemplate retryTemplate ...

  2. 自己动手实践 spring retry 重试框架

    前序 马上过年了,预祝大家,新年快乐,少写bug 什么是spring retry? spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断. 什么时候用? 远程 ...

  3. Spring Cloud重试机制与各组件的重试总结

    SpringCloud重试机制配置 首先声明一点,这里的重试并不是报错以后的重试,而是负载均衡客户端发现远程请求实例不可到达后,去重试其他实例. ? 1 2 3 4 5 6 7 8 @Bean @Lo ...

  4. Java之Retry重试机制详解

    应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务上传数据后对返回的结果进行处理:第二步拿到第一步结 ...

  5. Spring Retry 重试

    重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次.用定时任务也可以实现重试的效果,但比较麻烦,用Spring Retry的话一个注解搞定所有.话不多说 ...

  6. Guava Retry重试机制

    1.添加pom依赖 <dependency> <groupId>com.github.rholder</groupId> <artifactId>gua ...

  7. spring boot常用注解小计

    @Async 需要执行异步方法时,在方法上加上@Async之后,底层使用多线程技术 .启动类上需要加上 @EnableAsync 注意:异步执行方法,不能与引用方法同在一个类里 @Transactio ...

  8. 012 spring retry重试原理的解析

    有点复杂,在后续的章节,将会对其中涉及到的知识点,再分章节进行说明. 1.程序结构 2.@Retryable package com.jun.web.annotation.theory; import ...

  9. springboot 整合retry(重试机制)

    当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的 ...

  10. JAVA重试机制多种方式深入浅出

    重试机制在分布式系统中,或者调用外部接口中,都是十分重要的. 重试机制可以保护系统减少因网络波动.依赖服务短暂性不可用带来的影响,让系统能更稳定的运行的一种保护机制. 为了方便说明,先假设我们想要进行 ...

随机推荐

  1. 为什么我们痴迷于令人兴奋的 ChatGPT AI 聊天机器人

    .markdown-body { color: rgba(89, 89, 89, 1); font-size: 15px; font-family: -apple-system, system-ui, ...

  2. ASCII字符与非ASCII字符的正则

    private static System.Text.RegularExpressions.Regex regex = new Regex("([\u0000-\uffff])") ...

  3. Java并发基础之多线程

    文章也发布在我的个人博客上:https://blog.ysboke.cn/archives/129.html 概述 每个Thread类的示例都代表一个线程,而进程是操作系统级别的多任务,JVM就是运行 ...

  4. E - Stamp

    题目链接 : E - Stamp (atcoder.jp) 题意:给定长为n的s串,m的t串,和一个长度为n的x串,问你能否操作任意次数的操作, 每次操作都可以使x中长度为m的存在串变为t,最后使得变 ...

  5. 飞牛OS给容器魔方上行宽带限速

    下面我将详细讲解(容器网络命名空间限速)的持久化配置步骤,确保在飞牛OS重启后自动生效.请严格按照顺序执行以下操作: ️ 完整持久化配置教程(带详细解释) 步骤1:确认容器魔方名称 # 查看运行的容器 ...

  6. 关于打高版本java,cc6复现

    关于打高版本java,cc6复现 从上一篇的cc1中我们发现他不能作用在jdk_8u71以上的版本,因此;为了解决这个问题,引入了cc6 之所以不能用cc1打高版本,是由于在Java 8u71以后, ...

  7. Svelte 5 在跨平台 AI 阅读助手中的实践:轻量化前端架构的极致性能优化

    一.引言:为什么选择 Svelte 5 来构建 Saga Reader 的前端? 作为一个典型的前端开发者,去年在为公司调研Rust前端工具链.LLM应用开发技术体系的时候,对这类技术领域产生了浓厚的 ...

  8. Go语言new和make的区别

    一.简单说明 方法 作用 作用对象 返回值 new 分配内存 值类型和用户定义的类型 初始化为零值,返回指针 make 分配内存 内置引用类型(map,slice,channel) 初始化为零值,返回 ...

  9. 有知道CAE软件Hypermesh的配置要求吗?

    Altair的Hypermesh是一款先进的有限元分析软件,用于高效地处理和模拟复杂的三维几何形状.作为一款仿真软件,Hypermesh的CPU和GPU配置是非常重要的. 首先,对于Hypermesh ...

  10. RS422串口服务器

    RS422串口服务器ZLAN5143-422的一款专门为抗雷击.抗电磁干扰.抵抗恶劣环境要求而设计的一款高可靠性.高性能串口服务器/Modbus网关产品,是串口服务器的旗舰级产品.可以应用于隧道监控. ...