前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你不得不知的重试神器-Retryer

你不得不知的重试神器-Retryer

作者头像
加多
发布于 2020-06-16 07:47:59
发布于 2020-06-16 07:47:59
2K00
代码可运行
举报
文章被收录于专栏:Java编程技术Java编程技术
运行总次数:0
代码可运行

一、前言

好的代码应该具备健壮性,比如代码里面调用了一个http请求,如果当时网络抖了下,http就调用失败了,这时候我们往往需要重试,本文我们就来介绍一个功能比较完善的重试组件-Retryer。

二、Retryer介绍

使用组件需要首先在项目中引入maven依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <dependency>
      <groupId>com.github.rholder</groupId>
      <artifactId>guava-retrying</artifactId>
      <version>2.0.0</version>
    </dependency>

下面我们通过一个例子,来看如何使用该组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.创建重试器对象
    private final static Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
            .retryIfResult(Predicates.<Boolean>isNull())// 1.1当重试的方法返回null时候进行重试
            .retryIfExceptionOfType(IOException.class)// 1.2当重试方法抛出IOException类型异常时候进行重试
            .withStopStrategy(StopStrategies.stopAfterAttempt(3))// 1.3尝试执行三次(也就是重试2次)
            .withWaitStrategy(WaitStrategies.fixedWait(2, TimeUnit.SECONDS))//1.4重试间隔
            .build();

    public static void main(String[] args) {

        // 2需要重试的方法
        Callable<Boolean> callable = new Callable<Boolean>() {
            public Boolean call() throws Exception {

                // dosomthing

                return null; // do something useful here
            }
        };

        // 3.添加需要重试方法到执行器
        try {
            Boolean result = retryer.call(callable);
            System.out.println(result);
        } catch (RetryException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

如上代码1我们创建了一个重试器对象并配置了其重试参数,其中代码1.1我们使用retryIfResult方法设置当重试方法返回值什么时候进行重试,这里我们设置当返回值为null时候进行重试,该方法枚举值有:

  • alwaysTrue() 无论返回值是啥,都进行重试
  • alwaysFalse() 返回值是啥,都不进行重试
  • isNull() 返回值为null,进行重试
  • notNull() 返回值不为null,进行重试
  • not(Predicate<T> predicate) 自己设置谓词表达式,决定返回值为啥时候时候进行重试

代码1.2通过retryIfExceptionOfType方式设置,当重试的方法执行过程中抛出了什么类型的异常后,进行重试。在进行重试时候一般我们不是发生什么错误都进行重试,比如执行数据库插入操作时候,如果发生了主键冲突,则没必要进行重试。

代码1.3设置重试停止策略,一般我们都传递StopStrategies.stopAfterAttempt(3)来设置重试次数,比如我们设置重试方法执行3次(一次正常执行,二次重试),如果还是失败则停止重试。

代码1.4设置重试间隔,通过方法 withWaitStrategy,设置当重试方法执行失败后,下一次重试什么时候开始,一般策略有等待多少时间后,进行下一次重试,常用策略如下:

  • WaitStrategies.fixedWait(2, TimeUnit.SECONDS) 等待固定多少时间进行重试
  • WaitStrategies.incrementingWait(3, TimeUnit.SECONDS,1,TimeUnit.SECONDS) 每次重试等待时间添加个增量
  • WaitStrategies.fibonacciWait(1000,10,TimeUnit.SECONDS) 斐波那契数列方式设置重试间隔。

如上代码2我们创建了一个需要重试的任务,代码3添加需要重试方法到执行器。最后Retryer是线程安全的?也就是整个JVM内我创建了一个retryer实例,多线程同时向retryer里面添加重试任务,会存在问题?

答案是,不存在问题,其是线程安全的。这是因为Retryer内部与重试相关的变量是在第一次添加任务时候,通过new了与任务相关的ResultAttempt进行隔离了,每个重试任务有自己的ResultAttempt变量来记录重试信息。

组件开源地址:https://github.com/rholder/guava-retrying

三、总结

工具用的6,可以提高工作效率;另一方面好的开源组件,代码质量还是比较高的,可以学习期设计思想与代码实现;最后使用开源组件相比自己手写也可以提高稳定性^^。一句话:善用工具,会起到事半功倍的效果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot 实现Guava Retry重试机制
一般在各种业务场景中,为了保持系统稳定,我们都会有相应的重试机制,因为比如说,某个接口某个数据库链接由于网络抖动或者其他因素导致响应失败,这时候直接判定失败或者Mock数据未必是一种优雅的方式,因为这种情况下未必是接口挂掉了或者数据库连不上了,有可能是网络一时的抖动导致的,所以这时候一个优雅的重试机制或许能帮上我们。
HLee
2021/04/22
1.6K0
SpringBoot 实现Guava Retry重试机制
Spring-Retry 和 Guava-Retry,各有千秋
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 一 重试框架之Spring-Retry Spring Retry 为 Spring 应用程序提供了声明性重试支持。它用于Spring批处理、Spring集成、Apache Hadoop(等等)。它主要是针对可能抛出异常的一些调用操作,进行有策略的重试 1. Spring-Retry的普通使用方式 1.准备工作 我们只需要加上依赖:  <dependency>     <groupId>org.springframework.retry</
猿天地
2022/08/31
8210
Spring-Retry 和 Guava-Retry,各有千秋
Retry框架之Guava Retry
一般在各种业务场景中,为了保持系统稳定,我们都会有相应的重试机制,因为比如说,某个接口某个数据库链接由于网络抖动或者其他因素导致响应失败,这时候直接判定失败或者Mock数据未必是一种优雅的方式,因为这种情况下未必是接口挂掉了或者数据库连不上了,有可能是网络一时的抖动导致的,所以这时候一个优雅的重试机制或许能帮上我们。
黑洞代码
2021/04/08
2.2K0
这或许是实现重试最优雅的姿势了!
在日常开发中,我们经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务是否存活( Active)。
搜云库技术团队
2019/10/30
6550
重试组件使用与原理分析(二)-guava-retrying
上一篇文章我们介绍了实际项目开发中重试的应用场景,以及spring-retry原理和源码的详细介绍,那么此篇我们将会详细介绍一下另外一个常用的重试组件guava-retrying。
叔牙
2020/11/19
2K0
重试组件使用与原理分析(二)-guava-retrying
【最佳实践】如何优雅的进行重试
最近公司在搞活动,需要依赖一个第三方接口,测试阶段并没有什么异常状况,但上线后发现依赖的接口有时候会因为内部错误而返回系统异常,虽然概率不大,但总因为这个而报警总是不好的,何况死信队列的消息还需要麻烦运维进行重新投递,所以加上重试机制势在必行。
弗兰克的猫
2019/08/14
1.4K0
技术 | 使用 guava-retrying 实现灵活的重试机制
我们的后端业务系统可能会出现接口调用失败、网络拥塞超时、任务执行失败、系统错误等异常情况,需要进行重试操作。但某些场景下我们对重试有特殊要求,比如延迟重试、降频重试等,此时自己编写重试代码会很繁琐,在 Java 中,可以使用 guava-retrying 帮我们实现灵活的重试机制。
程序员鱼皮
2020/11/25
10.7K0
技术 | 使用 guava-retrying 实现灵活的重试机制
Java开发利器之重试器
在平时开发中经常会遇到需要调用接口和外部服务的场景,但是有些接口服务方不能立即返回数据,而是需要处理一段时间才能返回真实的业务数据,如果没有处理完则直接返回一个中间状态的结果。
Bug开发工程师
2021/03/03
8000
Java开发利器之重试器
强悍的Spring之Spring Retry
在日常开发中,我们经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务是否存活。
你呀不牛
2021/05/28
1.7K0
服务治理之重试篇
无论是单体服务模块化的调用,或是微服务当道的今天服务间的相互调用。一次业务请求包含了太多的链条环扣,每一扣的失败都会导致整个请求的失败。因此需要保障每个环节的可用性。
WindWant
2020/09/10
1.5K0
深入解析Google Guava库与Spring Retry重试框架
Guava库是Google提供的一套Java核心库,旨在增强Java集合、缓存、并发、I/O、字符串处理等核心功能。其中,Guava Retryer是Guava库的一个扩展组件,用于实现重试逻辑。
公众号:码到三十五
2024/03/19
4950
使用 Guava-Retry 优雅的实现重处理
在日常开发中,尤其是在微服务盛行的时代下,我们在调用外部接口时,经常会因为第三方接口超时、限流等问题从而造成接口调用失败,那么此时我们通常会对接口进行重试,那么问题来了,如何重试呢?该重试几次呢?如果要设置重试时间超过多长时间后还不成功就不重试了该怎么做呢?所幸guava-retrying为我们提供了强大而简单易用的重试框架guava-retrying。
码猿技术专栏
2023/05/01
1.2K0
java retry(重试) spring retry, guava retrying 详解
转载 自 http://blog.51cto.com/9250070/2156431
allsmallpig
2021/02/25
1.5K0
工具篇:介绍几个好用的guava工具类
平时我们都会封装一些处理缓存或其他的小工具。但每个人都封装一次,重复造轮子,有点费时间。有没有一些好的工具库推荐-guava。guava是谷歌基于java封装好的开源库,它的性能、实用性,比我们自己造的轮子更好,毕竟谷歌出品,下面介绍下几个常用的guava工具类
潜行前行
2021/06/25
2.3K0
高性能,100 W级任务重试框架!号称超越Spring-Retry和Guava-Retry的选项!
想象个系统容纳了数百万用户,需要高效获取每个用户的身份信息。若你还在依赖SpringRetry或GuavaRetry等单线程的同步重试机制,那无疑是望洋兴叹。即便加大硬件和线程投入,也只是杯水车薪。而Fast-Retry正是为此而生。
程序视点
2024/07/26
2240
高性能,100 W级任务重试框架!号称超越Spring-Retry和Guava-Retry的选项!
海量交易订单查询没做“重试”,一哥们“喜提”P3故障!
由于现在PDD模式比较火,某大厂的一哥们,接到老板的需求,做一个拼团业务,具体的业务需求是这样的:
JAVA葵花宝典
2020/10/09
9480
海量交易订单查询没做“重试”,一哥们“喜提”P3故障!
07. HTTP接口请求重试怎么处理?
HTTP接口请求重试是指在请求失败时,再次发起请求的机制。在实际应用中,由于网络波动、服务器故障等原因,HTTP接口请求可能会失败。为了保证系统的可用性和稳定性,需要对HTTP接口请求进行重试。
有一只柴犬
2024/01/25
6100
07. HTTP接口请求重试怎么处理?
笑了,面试官问我知不知道异步编程的Future。
文本主要分享这个 future 的调用方式,不讲 Dubbo 框架,这里只是一个引子。
why技术
2020/08/13
4570
笑了,面试官问我知不知道异步编程的Future。
线程池submit和execute,搞不好会引发线上故障
这两个方法都可以用来提交任务给线程池,但是又有所区别。我们先来看下二者的使用示例,先有个直观认识。
用户7634691
2020/08/10
2.4K0
《Java编程思想》学习笔记18——并发编程(一)
http://blog.csdn.net/chjttony/article/details/7039602
bear_fish
2018/09/20
3940
《Java编程思想》学习笔记18——并发编程(一)
推荐阅读
相关推荐
SpringBoot 实现Guava Retry重试机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验