Spring-retry 优雅的实现循环重试功能

这篇具有很好参考价值的文章主要介绍了Spring-retry 优雅的实现循环重试功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

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

 文章来源地址https://www.toymoban.com/news/detail-528726.html

到了这里,关于Spring-retry 优雅的实现循环重试功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot如何优雅的实现重试功能

    在有些特定场景,如和第三方对接。 我们调用接口时需要支持重试功能,第一次调用没成功,我们需要等待x秒后再次调用。 通常会设置重试次数,避免业务。 一般我们会这样写 这样写本身,没什么问题。 但是如果多个接口都需要重试的话,代码就不优雅了。 spring系列的

    2024年02月08日
    浏览(33)
  • 如果你需要使用重试机制,请使用Spring官方的Spring Retry

    Spring Retry 是 Spring Framework 中的一个模块,提供了一种简单的方式来在应用程序中实现重试机制。 在应用程序中,如果遇到了一些不可避免的错误,比如网络连接失败、数据库连接失败等,我们通常需要对这些错误进行重试,以尝试解决这些问题。 Spring Retry 提供了一个可插拔

    2024年02月13日
    浏览(27)
  • rabbitmq:retry重试机制和延迟消息的实现

    rabbitmq:retry重试机制和延迟消息的实现 在消费者消费消息的时候可能会因为网络等外部原因导致消息处理失败,这个时候如果将消息直接丢弃会导致正常的业务丢失,但是如果是一条本身就有问题的消息,那么这个时候又必须丢弃掉,如果选择用channel.basicNack 或 channel.basi

    2024年02月13日
    浏览(28)
  • 如何在Spring Boot中优雅地重试调用第三方API?

    🎉如何在Spring Boot中优雅地重试调用第三方API? ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,如果文中出现错误,

    2024年02月05日
    浏览(85)
  • axios-retry插件-axios请求失败自动重试

    axios-retry 对外导出 axiosRetry() 方法: 通过对 axios 单例添加“拦截器”,来扩展实现自动重试网络请求功能。 备注:  除非  shouldResetTimeout 被设置, 这个插件 将请求超时解释为全局值, 不是针对每一个请求,二是全局的设置 Name Type Default Description retries Number 3 The number of times t

    2024年02月10日
    浏览(66)
  • 分布式重试服务平台 Easy-Retry

      在介绍这款开源产品前先给大家介绍一个开源组织:aizuda–爱组搭   可以看到Easy-Retry就是爱组搭的开源项目之一。   在分布式系统大行其道的当前,系统数据的准确性和正确性是重大的挑战,基于CAP理论,采用柔性事务,保障系统可用性以及数据的最终一致性成为

    2024年02月09日
    浏览(32)
  • SpringBoot中 如何优雅的 重试调用 第三方API?

    引言 在实际的应用中,我们经常需要调用第三方API来获取数据或执行某些操作。然而,由于网络不稳定、第三方服务异常等原因,API调用可能会失败。为了提高系统的稳定性和可靠性,我们通常会考虑实现重试机制。 本文将深入探讨如何在Spring Boot项目中优雅地重试调用第三

    2024年01月21日
    浏览(41)
  • 高效处理消息:使用Spring Boot实现消息重试机制

    当涉及到消息发送和接收的可靠性,Spring Boot提供了一些机制来确保消息的可靠传递。其中包括消息确认机制和重试机制。下面是一个示例代码,演示如何在Spring Boot中实现可靠的消息发送和接收。 首先,我们需要配置RabbitMQ的连接信息和相关属性。在 application.properties 文件中

    2024年02月11日
    浏览(39)
  • 详解SpringBoot中如何优雅地重试调用第三方API?

    作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端。但你不能保证所有的事情一直都很顺利。像有些第三方API,偶尔会出现超时。此时,我们要重试几次,这取决于你的重试策略。 下面举一个我在日常开发中多次看到的例子:

    2024年02月02日
    浏览(50)
  • Spring Boot 实现程序的优雅退出

    🏷️ 个人主页 :牵着猫散步的鼠鼠  🏷️ 系列专栏 :Java全栈-专栏 🏷️ 个人学习笔记,若有缺误,欢迎评论区指正   目录 前言 优雅停机是什么 SpringBoot如何实现优雅停机 合理杀死进程 法一:配置设置SpringBoot优雅停机 法二:配置Tomcat 容器优雅停机 设置Tomcat 容器关闭

    2024年03月20日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包