Spring-retry实现循环重试功能

 更新时间:2023年07月07日 14:11:35   作者:zsq_fengchen  
这篇文章主要介绍了Spring-retry 优雅的实现循环重试功能,通过@Retryable注解,优雅的实现循环重试功能,需要的朋友可以参考下

引言

在实际的应用场景中,可能经常会遇到,当请求一个接口调一个服务的时候,出现异常或网络出现故障的情况下就会失败,而对于那些重要的服务当失败后,可能我们就会进行重试,多调用几次,如果还是失败再另外进行单独处理。接下来,就是要讲解的重点内容,我们可以通过@Retryable注解,优雅的实现循环重试功能。

1:引入依赖

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

2:在启动类上开启retry重试功能

package com.patent.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;
@SpringBootApplication
@EnableRetry
public class PatenCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(PatenCloudApplication.class, args);
    }
}

3:业务处理,在要调用的方法上加上@Retryable注解

 @Autowired
    private VehicleLocationDataService vehicleLocationDataService;
    /**
     * 需要在启动类中添加@EnableRetry注释以开启重试功能,最后在相应的方法上添加@Retryable注解。
     * @Recover注解,重试完成之后执行的回调方法
     * 重试机制,如果调用方法过程中触发了RuntimeException异常,则20秒后重试一次,最多重试3次,三次重试后会触发recover方法
     * @param orderNo
     * @param chassisNo
     * @param carStatus
     */
    @GetMapping("/retryMyTest")
    @Retryable(value = RuntimeException.class,maxAttempts = 3, backoff = @Backoff(value = 10000L), recover = "recover", listeners = {"myRetryListener"})
    public void retry(String orderNo, String chassisNo, String carStatus) throws RuntimeException {
        vehicleLocationDataService.retryMyTest(orderNo,chassisNo,carStatus);
    }

4:retryMyTest方法的逻辑处理

package com.patent.cloud.retry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class VehicleLocationDataService {
    public  static  Integer retryCount = 1;
    public void retryMyTest(String orderNo, String chassisNo, String carStatus){
        boolean flag = false;
        if("P8012985".equals(chassisNo)){
            flag = true;
        }
        if(retryCount==4){
            retryCount =1;
        }
        if(!flag){
           log.info("有异常哦,我再试多几次看下还有没异常, 重试第{}次, {},{},{}",retryCount, orderNo,chassisNo,carStatus);
           retryCount ++;
            throw new RuntimeException("调用失败!");
        }
    }
}

当程序出现RuntimeException的时候,就好触发重试

5:recover方法,上边定义了maxAttempts 为3,也就是说,重试三次后,如果还失败了,则调用recover方法,需要在方法上标注@Recover注解

@Recover
public void recover(RuntimeException runtimeException,String orderNo, String chassisNo, String carStatus) {
  log.info("=======触发重试了recover方法======{}==={}=={}===",orderNo,chassisNo,carStatus);
}

6:监听,同时还是对重试方法进行了监听,如我们在方法retry上,加了listeners 监听

package com.patent.cloud.retry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;
import org.springframework.retry.listener.RetryListenerSupport;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class MyRetryListener extends RetryListenerSupport {
    @Override
    public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        log.info("监听到重试过程关闭了");
        log.info("=======================================================================");
    }
    @Override
    public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        log.info("监听到重试过程错误了");
    }
    @Override
    public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
        log.info("=======================================================================");
        log.info("监听到重试过程开启了");
        return true;
    }
}

7:运行结果

到此这篇关于Spring-retry 优雅的实现循环重试功能的文章就介绍到这了,更多相关Spring-retry循环重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot框架的MD5加密方式

    SpringBoot框架的MD5加密方式

    这篇文章主要介绍了SpringBoot框架的MD5加密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • spring cglib 与 jdk 动态代理

    spring cglib 与 jdk 动态代理

    本篇文章主要介绍了spring cglib与jdk动态代理的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • 利用Springboot+vue实现图片上传至数据库并显示的全过程

    利用Springboot+vue实现图片上传至数据库并显示的全过程

    最近遇到个需求,需要将图片在前端上传到服务器进行保存,然后读取到前端进行展示,这篇文章主要给大家介绍了关于利用Springboot+vue实现图片上传至数据库并显示的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java实战之兼职平台系统的实现

    Java实战之兼职平台系统的实现

    这篇文章主要介绍了如何利用Java编写一个兼职平台系统,采用到的技术有Springboot、SpringMVC、MyBatis、ThymeLeaf等,感兴趣的小伙伴可以了解一下
    2022-03-03
  • Java获取当地的日出日落时间代码分享

    Java获取当地的日出日落时间代码分享

    这篇文章主要介绍了Java获取当地的日出日落时间代码分享,国外猿友写的一个类,需要的朋友可以参考下
    2014-06-06
  • 简单了解Java synchronized关键字同步

    简单了解Java synchronized关键字同步

    这篇文章主要介绍了简单了解Java synchronized关键字同步,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java之理解Redis回收算法LRU案例讲解

    Java之理解Redis回收算法LRU案例讲解

    这篇文章主要介绍了Java之理解Redis回收算法LRU案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • java之swing实现复选框的方法

    java之swing实现复选框的方法

    这篇文章主要介绍了java之swing实现复选框的方法,实例分析了java基于图形界面复选框的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Mybatis如何从数据库中获取数据存为List类型(存为model)

    Mybatis如何从数据库中获取数据存为List类型(存为model)

    这篇文章主要介绍了Mybatis如何从数据库中获取数据存为List类型(存为model),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 教你用JAVA写文本编辑器(三)

    教你用JAVA写文本编辑器(三)

    这篇文章主要给大家介绍了关于用JAVA写文本编辑器的相关资料,本文主要实现的是一个点击选择文本格式的窗口,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11

最新评论