加入收藏 | 设为首页 | 会员中心 | 我要投稿 南京站长网 (https://www.025zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

零侵入性:一个注解,在Spring Boot中优雅实现循环重试!

发布时间:2022-10-16 00:01:05 所属栏目:MsSql教程 来源:未知
导读: 点击上方“芋道源码”,选择“”
管她前浪,还是后浪?
能浪的浪,才是好浪!
每天 10:33更新文章,每天掉亿点点头发...
源码精品专栏
在实际工作中,重处理是一个非常常见的场景,比如:

点击上方“芋道源码”,选择“”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33更新文章,每天掉亿点点头发...

源码精品专栏

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:

spring系列的spring-retry是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释的。

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:

?<dependency>
??<groupId>org.springframework.retrygroupId>
??<artifactId>spring-retryartifactId>
?dependency>

@EnableRetry
@SpringBootApplication
public?class?HelloApplication?{

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

}

import?com.mail.elegant.service.TestRetryService;
import?org.springframework.retry.annotation.Backoff;
import?org.springframework.retry.annotation.Retryable;
import?org.springframework.stereotype.Service;
import?java.time.LocalTime;
?
@Service
public?class?TestRetryServiceImpl?implements?TestRetryService?{
?
????@Override
????@Retryable(value?=?Exception.class,maxAttempts?=?3,backoff?=?@Backoff(delay?=?2000,multiplier?=?1.5))
????public?int?test(int?code)?throws?Exception{
????????System.out.println("test被调用,时间:"+LocalTime.now());
??????????if?(code==0){
??????????????throw?new?Exception("情况不对头!");
??????????}
????????System.out.println("test被调用,情况对头了!");
?
????????return?200;
????}
}

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

当重试耗尽时还是失败,会出现什么情况呢?

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

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

可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。对于@Recover注解的方法,需要特别注意的是:

本篇主要简单介绍了Springboot中的Retryable的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的。

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

WHILE循环语法_java while语法_while循环用法

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例WHILE循环语法,以及超 4W 行代码的电商微服务项目。

(编辑:南京站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!