基于 Guava Retry 在Spring封装一个重试功能

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

pom依赖

<dependency>
    <groupId>com.github.rholder</groupId>
    <artifactId>guava-retrying</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

注解类

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Retryable {
    /**
     * 需要重试的异常类型
     * this.isAssignableFrom(方法抛出的异常) 也就是说,方法抛出的异常必须是retryOn的子类或者子接口
     */
    Class<? extends Throwable> retryOn() default Throwable.class;

    // 重试次数
    int maxAttempts() default 3;

    // 重试间隔
    long delayMillis() default 1000;
}

import com.github.rholder.retry.RetryException;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.WaitStrategies;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
@Aspect
@Order(1)
public class RetryableAspect {

    @Around("@annotation(retryable)")
    public Object retry(ProceedingJoinPoint joinPoint, Retryable retryable) throws Throwable {
        Retryer<Object> retryer = RetryerBuilder.<Object>newBuilder()
                .retryIfExceptionOfType(retryable.retryOn())
                .withStopStrategy(StopStrategies.stopAfterAttempt(retryable.maxAttempts()))
                .withWaitStrategy(WaitStrategies.fixedWait(retryable.delayMillis(), TimeUnit.MILLISECONDS))
                .build();

        try {
            return retryer.call(() -> {
                try {
                    return joinPoint.proceed();
                } catch (Exception exception) {
                    throw exception;
                } catch (Throwable e) {
                    throw new WrapRetryThrowable(e);
                }
            });
        } catch (RetryException e) {
            throw e.getLastFailedAttempt().getExceptionCause();
        }
    }

    public static class WrapRetryThrowable extends Exception {

        public WrapRetryThrowable(Throwable cause) {
            super(cause);
        }
    }

}

测试类文章来源地址https://www.toymoban.com/news/detail-644959.html

在这里插入代码片@RestController
public class RetryController {

    /**
     * 顶级异常类测试
     * @return
     * @throws Throwable
     */
    @Retryable(
            retryOn = Exception.class,
            maxAttempts = 3,
            delayMillis = 1000
    )
    @GetMapping("/throwable")
    public String performTask() throws Throwable {
        System.out.println("performTask" + System.currentTimeMillis());
        // 在这里实现可能抛出异常的业务逻辑
        throw new Throwable("error");
    }


    /**
     * 异常类测试
     * @return
     * @throws CustomException
     */
    @Retryable(
            retryOn = CustomException.class,
            maxAttempts = 2,
            delayMillis = 1000
    )
    @GetMapping("/customException")
    public void customException() {
        System.out.println("customException" + System.currentTimeMillis());
        // 在这里实现可能抛出异常的业务逻辑
    }

    // 抛出的异常跟枚举异常不一致,不会重试
    @Retryable(
            retryOn = CustomException.class,
            maxAttempts = 3,
            delayMillis = 1000
    )
    @GetMapping("/customException2")
    public String customException2() throws Exception {
        System.out.println("customException2" + System.currentTimeMillis());
        // 在这里实现可能抛出异常的业务逻辑
        throw new Exception("这是一段自定义异常的抛出");
    }


}

到了这里,关于基于 Guava Retry 在Spring封装一个重试功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 如果你需要使用重试机制,请使用Spring官方的Spring Retry

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

    2024年02月13日
    浏览(37)
  • 布隆过滤器讲解及基于Guava BloomFilter案例

    目录 1、布隆过滤器是什么 2、主要作用 3、存储过程 4、查询过程 5、布隆过滤器的删除操作 6、优点 7、缺点 8、测试误判案例 8.1、引入Guava依赖 8.2、编写测试代码 8.3、测试 8.4、BloomFilter实现原理  9、总结 推荐博主视频,讲的很棒:布隆过滤器详解         布隆过滤器(

    2023年04月09日
    浏览(36)
  • 【开源与项目实战:开源实战】81 | 开源实战三(上):借Google Guava学习发现和开发通用功能模块

    上几节课,我们拿 Unix 这个超级大型开源软件的开发作为引子,从代码设计编写和研发管理两个角度,讲了如何应对大型复杂项目的开发。接下来,我们再讲一下 Google 开源的 Java 开发库 Google Guava。 Google Guava 是一个非常成功、非常受欢迎的开源项目。它在 GitHub 上由近 3.7 万

    2024年02月11日
    浏览(43)
  • 【Redis(8)】Spring Boot整合Redis和Guava,解决缓存穿透、缓存击穿、缓存雪崩等缓存问题

    在缓存技术的挑战及设计方案我们介绍了使用缓存技术可能会遇到的一些问题,那么如何解决这些问题呢? 在构建缓存系统时,Spring Boot和Redis的结合提供了强大的支持,而Guava的 LoadingCache 则为缓存管理带来了便捷的解决方案。下面我将介绍如何通过整合Spring Boot、Redis和Gu

    2024年04月22日
    浏览(48)
  • 基于Guava布隆过滤器的海量字符串高效去重实践

    在Java环境中处理海量字符串去重的问题时,布隆过滤器(BloomFilter)是一种非常高效的数据结构,尽管它有一定的误报率。布隆过滤器适用于那些可以接受一定误报率,并且希望节省空间和时间成本的场景。 使用Google Guava库来实现基于布隆过滤器的海量字符串去重是一个很好

    2024年01月24日
    浏览(39)
  • 【Guava笔记01】Guava Cache本地缓存的常用操作方法

    这篇文章,主要介绍Guava Cache本地缓存的常用操作方法。 目录 一、Guava Cache本地缓存 1.1、引入guava依赖 1.2、CacheBuilder类 1.3、Guava-Cache使用案例

    2024年01月23日
    浏览(40)
  • com.google.guava:guava 组件安全漏洞及健康分析

    维护者 google组织 许可证类型 Apache-2.0 首次发布 2010 年 4 月 26 日 最新发布时间 2023 年 8 月 1 日 GitHub Star 48189 GitHub Fork 10716 依赖包 28,694 依赖存储库 219,576 Guava 是 Google 的一组核心 Java 库,其中包括新的集合类型(例如 multimap 和 multiset)、不可变集合、图形库以及用于并发、

    2024年02月10日
    浏览(47)
  • 【Guava】Guava: Google Core Libraries for Java 好用工具类

    Guava是Google的一组核心Java库,其中包括 新的集合类型 (如multimap和multiset) 、 不可变集合 、 图库 ,以及用于 并发、I/O、哈希、缓存、基元、字符串 等的实用程序!它 被广泛用于谷歌内的大多数Java项目,并被许多人广泛使用。 Guava是一种基于开源的Java库 ,Google Guava源于

    2024年02月11日
    浏览(39)
  • com.google.common.collect 是 Google Guava 库中的一个包,它提供了一系列扩展和增强 Java 集合框架的工具类和数据结构

    com.google.common.collect 是 Google Guava 库中的一个包,它提供了一系列扩展和增强 Java 集合框架的工具类和数据结构。Guava 的集合工具在设计上强调性能、不可变性、功能性和易用性。 以下是 com.google.common.collect 包中一些重要的类和接口: Immutable Collections: ImmutableSet:一个不可变

    2024年03月19日
    浏览(57)
  • Guava RateLimiter预热模型

    本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 我们都知道在做运动之前先得来几组拉伸之类的动作,给身体做个热身,让我们的身体平滑过渡到

    2024年01月18日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包