返回顶部
首页 > 资讯 > 后端开发 > Python >使用注解@Recover优化丑陋的循环详解
  • 536
分享到

使用注解@Recover优化丑陋的循环详解

2024-04-02 19:04:59 536人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1使用背景2开始上代码3@Retryable注解重要属性解析4@backoff注解5@Recover注解6注意事项总结1使用背景 在实际项目中其中一部分逻辑可能会因为调用了外部服

1使用背景

在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行重试,代码里面主要就是使用for循环写一大坨重试的逻辑,各种硬编码,各种辣眼睛的补丁。

特别是针对重试的逻辑,到处都有。所以我决定用一个重试组件spring-retry优化一波。它的出现,解决掉这部分丑陋的代码!

这个组件的源码地址如下:https://GitHub.com/spring-projects/spring-retry

废话不多说,直接上代码吧!

2开始上代码

首先引入依赖:

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

由于该组件是依赖于 aop 给你的,所以还需要引入这个依赖(如果你其他 jar 包中引用过了,当然也就不需要再次引用了):

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

开启重试:

@SpringBootApplication
@EnableRetry
public class ApplicationStarter {
  public static void main(String[] args) {
  SpringApplication.run(ApplicationStarter.class);
  }
}

Controller层

@RestController
public class TestController {
@Autowired
private IRecursiveCallService recursiveCallService;
 
    @GetMapping("test2")
    public Object test2() {
        return recursiveCallService.testService();
    }
}

Service层

public interface IRecursiveCallService {
    
    List<Integer> testService();
}

Service层具体实现

@Service
public class RecursiveCallServiceImpl implements IRecursiveCallService {
 
    @Override
    @Retryable(recover = "testService3")
    public List<Integer> testService() {
        System.out.println("到此一游!");
        System.out.println(1 / 0);
        return null;
    }
 
    @Recover
    public List<String> testService1() {
        System.out.println("错误的返回");
        return Collections.singletonList("S");
    }
 
    @Recover
    public List<Integer> testService2(String i) {
        System.out.println("正确的返回");
        return Collections.singletonList(1);
    }
 
    @Recover
    public List<Integer> testService3() {
        System.out.println("正确的返回2");
        return Collections.singletonList(2);
    }
}

3@Retryable注解重要属性解析

  • recover: 此类中用于恢复的方法的名称。方法必须用 {@link Recover} 注释标记。
  • value: 可重试的异常类型。包括()的同义词。默认为空(如果 excludes 也为空,则重试所有异常)。
  • exclude: 不可重试的异常类型。默认为空(如果包含也为空,则重试所有异常)。如果 include 为空但 excludes 不是,则重试所有未排除的异常
  • maxAttempts: 方法重试调用次数,默认3次
  • backoff: 指定用于重试此操作的其他属性

4@backoff注解

  • value:重试之间间隔时间
  • delay:重试之间的等待时间(以毫秒为单位)
  • maxDelay:重试之间的最大等待时间(以毫秒为单位)
  • multiplier:指定延迟的倍数
  • delayExpression:重试之间的等待时间表达式
  • maxDelayExpression:重试之间的最大等待时间表达式
  • multiplierExpression:指定延迟的倍数表达式
  • random:随机指定延迟时间

5@Recover注解

主要作用是标记方法为一个重试方法的补偿方法!!!

6注意事项

方法重试依赖于 spring 注入,所以调用的方法的类必须是被spring管理的,然后通过 @Autowired 或 @Resource 引入使用,不然不会生效

方法重试的前提是方法抛出了异常,在方法执行出现了异常且没有被捕获的情况下重试

方法重试需要在方法上面加上注解 @Retryable

方法重试的补偿方法上面必须携带@Recover注解

@Recover方法需要和@Retryable方法在同一个类中才能生效@Recover方法(@Recover方法在父类中也可以生效)

使用@Retryable注解,如果类中没有被@Recover标示的方法,无论是否使用 recover 属性都抛出原有异常

使用@Retryable注解同时 recover 属性不是空,如果类中有@Recover标示的方法,但是标示的方法不是 recover 指定的方法,抛出ExhaustedRetryException异常

使用@Retryable注解同时 recover 属性不是空,同时方法有注解@Recover,但是补偿方法的参数不是当前异常或者异常的父类,抛出ExhaustedRetryException 异常

使用@Retryable注解不使用 recover 属性,如果类中被@Recover标示的方法有和原方法返回值一样的,使用当前被@Recover标示的方法(此时方法参数可随意,但是不能是除开当前异常的类及父类的异常类)

总结

到此这篇关于使用注解@Recover优化丑陋的循环的文章就介绍到这了,更多相关注解@Recover优化循环内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用注解@Recover优化丑陋的循环详解

本文链接: https://lsjlt.com/news/146742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用注解@Recover优化丑陋的循环详解
    目录1使用背景2开始上代码3@Retryable注解重要属性解析4@backoff注解5@Recover注解6注意事项总结1使用背景 在实际项目中其中一部分逻辑可能会因为调用了外部服...
    99+
    2024-04-02
  • foreach循环使用方法详解
    前言 在前面的文章中,千锋壹哥给大家讲解了for、while、do-while三种循环结构,并讲解了如何跳出循环的几种方式,比如break、continue、return等。但是截止到目前,与循环相关的内容还没有完事,我们还有最后一哆嗦,...
    99+
    2023-09-15
    java jvm 开发语言 Powered by 金山文档
  • Java for循环常见优化方法案例详解
    目录方法一:最常规的不加思考的写法方法二:数组长度提取出来方法三:数组长度提取出来方法四:采用倒序的写法方法五:Iterator 遍历方法六:jdk1.5后的写法方法七:循环嵌套外小...
    99+
    2024-04-02
  • 详解Java编译优化之循环展开和粗化锁
    目录循环展开和粗化锁分析Assembly日志禁止Loop unrolling循环展开和粗化锁 我们先来回顾一下什么是循环展开。 循环展开就是说,像下面的循环遍历的例子: for ...
    99+
    2024-04-02
  • Vue 循环的优化之道,解锁高性能应用!
    为循环中的每个项目提供唯一的 key 属性至关重要。它使 Vue 能够高效地跟踪和更新项目,避免不必要的重新渲染。 2. 避免在循环中使用复杂计算 在循环中进行复杂计算会影响性能。考虑将它们移至循环之外或使用缓存机制来存储计算结果。 3....
    99+
    2024-04-02
  • forEach循环里break使用方式详解
    目录一. 在forEach里使用break 会发生什么二. 为什么不能在forEach里使用break你真的了解break吗三.如何在forEach的循环里break?在forEac...
    99+
    2024-04-02
  • 详解C语言中for循环与while循环的用法
    目录一、单层for循环二、for循环与if选择的嵌套三、多层for循环的嵌套四、while循环五、总结一、单层for循环 引例:C语言实现求1到10的和(用for循环实现) #inc...
    99+
    2024-04-02
  • shell中的for循环用法详解
    for 命令: for i in 的各种用法 : for i in “file1” “file2” “file3” for i in /boot/* for i in /etc/*.conf for ...
    99+
    2022-06-04
    shell for循环 shell for
  • Shell中的while循环几种使用实例详解
    1.利用while循环计算1到100的和: 示例代码1: #!/bin/bash i=1 sum=0 while [ $i -le 100 ] do let sum=sum+$i let i++ done ech...
    99+
    2022-06-04
    shell中while循环 shell中while循环的使用 shell中的while循环几种使用实例详解
  • MySql存储过程循环的使用分析详解
    目录简介场景描述解决方案案例总结简介 每一门数据库语言语法都基本相似,但是对于他们各自的一些特性(函数、存储过程等)的用法就不大相同了,就好比Oracle与mysql存储过程写起来就很多不同的地方,在这里主要是跟大家分享...
    99+
    2022-06-29
    MySql存储循环使用 MySql存储循环
  • 详解Rust中三种循环(loop,while,for)的使用
    目录楔子loop 循环while 循环for 循环楔子 我们常常需要重复执行同一段代码,针对这种场景,Rust 提供了多种循环(loop)工具。一个循环会执行循环体中的代码直到结尾,...
    99+
    2024-04-02
  • 详解iOS 用于解决循环引用的block timer
    一、什么是回调函数? 回调函数,本质上也是个函数(搁置函数和方法的争议,就当这二者是一回事)。由“声明”、“实现”、“调用”三部分组成。 在上面的例子中,我可以看出,函数amount...
    99+
    2022-05-18
    iOS block timer
  • Golang异常处理之defer,panic,recover的使用详解
    目录延迟是什么延迟函数延迟⽅法延迟参数堆栈的推迟延迟的应⽤panic和recover(宕机和宕机恢复)panic和recover机制示例代码延迟是什么 defer即延迟语句,极个别的...
    99+
    2024-04-02
  • vue中forEach循环的使用讲解
    目录forEach循环的使用使用forEach报错,this指向问题forEach循环的使用 //data为集合 data.forEach(function(item, index...
    99+
    2024-04-02
  • Java选择结构与循环结构的使用详解
    目录前言一.选择结构1.1 if选择结构的四种格式1.2 switch选择结构二.循环结构2.1 while循环结构2.2 do-while循环结构2.3 for循环结构2.4 fo...
    99+
    2024-04-02
  • Go语言中循环语句使用的示例详解
    目录一、概述1. 循环控制语句2. 无限循环二、Go 语言 for 循环1. 语法2. for语句执行过程3. 示例4. For-each range 循环三、循环嵌套1. 语法2....
    99+
    2024-04-02
  • 详解Go语言中for循环,break和continue的使用
    目录基本语法有始有终的条件循环带条件的循环无限循环数组循环使用计数器循环利用range循环Map循环string的遍历Break和Continue基本语法 和C语言同源的语法格式,有...
    99+
    2024-04-02
  • 怎么使用Spring注解实现循环重试功能
    这篇文章主要介绍“怎么使用Spring注解实现循环重试功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Spring注解实现循环重试功能”文章能帮助大家解决问题。一、@Retryable是什...
    99+
    2023-07-05
  • 详解如何解决使用JSON.stringify时遇到的循环引用问题
    程序员在日常做TypeScript/JavaScript开发时,经常需要将复杂的JavaScript对象通过JSON.stringify序列化成json字符串,保存到本地以便后续具体...
    99+
    2024-04-02
  • 一文详解MySQL—Join的使用优化
    目录mysql JOIN类型MySQL JOIN 算法Nested-Loop Join 算法执行流程工作原理时间复杂度分析block Nested-Loop Join 算法执行流程工作原理时间复杂度分析Hash Join...
    99+
    2023-04-21
    MySQL Join使用 MySQL Join优化 MySQL Join
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作