重试机制 Retry

2023-05-16

文章目录

    • 1、重试
      • 1.1 重试作用
    • 2、重试的三种方法
      • 2.1 java retry
      • 2.2 spring retry
      • 2.3 guava-retrying
        • 2.3.1 重试源
        • 2.3.2 自定义重试监听器 RetryListener
        • 2.3.3 停止重试策略 StopStrategy
        • 2.3.4 等待时长策略(控制时间间隔)withWaitStrategy
    • 3、guava-retrying demo
      • 3.1 Maven依赖
      • 3.2 项目结构

1、重试

1.1 重试作用

对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。

远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1、timeout=500,表示调用失败只重试1次,超过500ms调用仍未返回,则调用失败。

外部 RPC 调用,或者数据入库等操作,如果一次操作失败,可以进行多次重试,提高调用成功的可能性。

2、重试的三种方法

2.1 java retry

2.2 spring retry

2.3 guava-retrying

RetryerBuilder 是一个 factory 创建者,可以定制设置重试源且可以支持多个重试源,可以配置重试次数或重试超时时间,以及可以配置等待时间间隔创建重试者Retryer实例

2.3.1 重试源

RetryerBuilder 的重试源支持 Exception 异常对象和自定义断言对象,通过retryIfException 和 retryIfResult 设置,同时支持多个且能兼容

  • retryIfException,抛出 runtime 异常、checked 异常时都会重试,但是抛出 error 不会重试。

  • retryIfRuntimeException 只会在抛 runtime 异常的时候才重试,checked 异常和error 都不重试。

  • retryIfExceptionOfType 允许我们只在发生特定异常的时候才重试,比如NullPointerException 和 IllegalStateException 都属于 runtime 异常,也包括自定义的error。或通过Predicate实现。

    • .retryIfExceptionOfType(Error.class) // 只在抛出error时重试
    • .retryIfExceptionOfType(IllegalStateException.class)
    • .retryIfExceptionOfType(NullPointerException.class) // 只在抛出空指针异常时重试
    • .retryIfException(Predicates.or(Predicates.instanceOf(NullPointerException.class),
      Predicates.instanceOf(IllegalStateException.class)))
  • retryIfResult 可以指定你的 Callable 方法在返回值的时候进行重试,如

    • .retryIfResult(Predicates.equalTo(false)) // 返回false重试
    • .retryIfResult(Predicates.containsPattern("_error$")) //以_error结尾才重试

2.3.2 自定义重试监听器 RetryListener

  • 当发生重试之后,假如我们需要做一些额外的处理动作,比如记录异常日志,那么可以使用RetryListener。

  • 每次重试之后,guava-retrying 会自动回调我们注册的监听。我们也可以注册多个RetryListener,会按照注册顺序依次调用。

.withRetryListener(new RetryListener {
	@Override
	public <T> void onRetry(Attempt<T> attempt) {
		logger.error("第【{}】次调用失败" , attempt.getAttemptNumber());
    }
}

2.3.3 停止重试策略 StopStrategy

  • StopAfterDelay Strategy:设定一个最长允许的执行时间;比如设定最长执行10s,无论任务执行次数,只要重试的时候超出了最长时间,则任务终止,并返回重试异常RetryException;

  • NeverStop Strategy:不停止重试,用于需要一直轮训知道返回期望结果的情况;

  • StopAfterAttempt Strategy:设定最大重试次数,如果超出最大重试次数则停止重试,并返回重试异常;

2.3.4 等待时长策略(控制时间间隔)withWaitStrategy

  • FixedWait Strategy:固定等待时长策略。
  • RandomWait Strategy:随机等待时长策略(可以提供一个最小和最大时长,等待时长为其区间随机值)。
  • Incrementing WaitStrategy:递增等待时长策略(提供一个初始值和步长,等待时间随重试次数增加而增加)。
  • ExponentialWait Strategy:指数等待时长策略。
  • FibonacciWait Strategy :Fibonacci等待时长策略。
  • ExceptionWait Strategy:异常时长等待策略。
  • CompositeWait Strategy:复合时长等待策略。

3、guava-retrying demo

3.1 Maven依赖

引用Guava-Retrying的包

<dependency>
    <groupId>com.github.rholder</groupId>
    <artifactId>guava-retrying</artifactId>
    <version>2.0.0</version>
</dependency>

3.2 项目结构

在这里插入图片描述

  • RetryDemo.java
package com.xyy;

import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.google.common.base.Predicates;

import java.util.concurrent.TimeUnit;

import static com.github.rholder.retry.WaitStrategies.incrementingWait;

/**
 * @author wangxuexing
 * @descrption
 * @date
 */
public class RetryDemo {
    public static void main(String[] args) {
        Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder().
                //如果异常会重试
                retryIfException().
                //如果结果为false会重试
                retryIfResult(Predicates.equalTo(false)).
                //重调策略
                withWaitStrategy(incrementingWait(30, TimeUnit.SECONDS, 30, TimeUnit.SECONDS)).
                //尝试次数
                withStopStrategy(StopStrategies.stopAfterAttempt(3)).
                //注册监听
                withRetryListener(new MyRetryListener()).build();
        try {
            retryer.call(new TaskCallable());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • TaskCallable.java,其中TaskCallable是任务的具体实现类,它实现了Callable接口
package com.xyy;

import java.util.concurrent.Callable;


public class TaskCallable implements Callable<Boolean> {

    @Override
    public Boolean call() throws Exception {
        return false;
    }

}
  • MyRetryListener.java,MyRetryListener监听实现了RetryListener接口,每次重试都会回调注册的监听
package com.xyy;

import com.github.rholder.retry.Attempt;
import com.github.rholder.retry.RetryListener;

/**
 * @author wangxuexing
 * @descrption
 * @date
 */
public class MyRetryListener implements RetryListener {
    @Override
    public <V> void onRetry(Attempt<V> attempt) {
        System.out.print("[retry]time=" + attempt.getAttemptNumber());
        // 距离上一次重试的延迟
        System.out.print(",delay=" + attempt.getDelaySinceFirstAttempt());

        // 重试结果: 是异常终止, 还是正常返回
        System.out.print(",hasException=" + attempt.hasException());
        System.out.print(",hasResult=" + attempt.hasResult());

        // 是什么原因导致异常
        if (attempt.hasException()) {
            System.out.print(",causeBy=" + attempt.getExceptionCause().toString());
        } else {// 正常返回时的结果
            System.out.print(",result=" + attempt.getResult());
        }
        System.out.println();
    }
}
  • 执行结果
    在这里插入图片描述

参考:https://www.programminghunter.com/article/4327483899/
参考:https://segmentfault.com/a/1190000022962709

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重试机制 Retry 的相关文章

  • 【学习笔记】读取文件中的字符串与 fgets 的坑

    目录 前言环境问题模拟与复现正确的手法回顾 前言 今天写一个读取文件中字符串的函数 xff0c 理论上应该是很简单的 xff0c 但是写的时候发现输出的结果总是比文件中的内容少一个字符 xff0c 并且通过排查 xff0c 问题就是出在 f
  • [Atcoder Yahoo Contest 2019]D.Ears(动态规划)

    Score 600 600 6 0 0 points 题面 传送门 翻译有时间再补 题解 体验感极差 xff0c 考试的时候手残把1打成了2Debug了半个小时 害的F题都没做 先将题目转换一下 给你一条链 顺次连接着 n 43
  • 内网渗透-基础环境

    解决依赖 xff0c scope安装 打开要给cmd powershell 打开远程 Set ExecutionPolicy RemoteSigned scope CurrentUser 我试了好多装这东西还是得科学上网 xff0c 不然不
  • ubuntu(Linux)配置允许远程登陆

    安装ubuntu后默认不可以以root方式登录系统 xff0c 需要做以下配置 1 使用sudo i 命令可以让用户切换到root用户 xff0c guo用户是安装ubuntu时配置的用户 xff0c 因人而异 xff1b 2 配置root
  • Y9000P Ubuntu/Windows 双系统安装

    一 xff1a 配置介绍 Y9000P默认系统Win11 xff0c 系统盘500G xff0c 从盘2T xff0c 内存32G xff0c 显卡3060 二 xff1a Windows系统分盘 系统盘 xff08 磁盘1 xff09 建
  • axios的使用

    axios是基于Promise的HTTP库 xff0c 适用于各种前端框架 不同于普通http请求后的回调 xff0c Promise有更好的操作性 axios可以自动转换JSON数据 客户端支持防御XSRF攻击 axios的简单使用 安装
  • 怎么通过SQL取出数据库中JSON字段中的值

    我们的数据库中经常会遇到很多JSON的字段 xff0c 自己写的也好 xff0c 别人写的也好 一般我们取这个值的话 xff0c 会创建一个typeHandler来取值 那么如果我们想直接取到JSON里的值该怎么办呢 xff1f 其实很简单
  • GCC使用说明

    超详细的参考官方手册下载地址 https download csdn net download qq 34991787 16188604 GCC代表 GNU编译器合集 可编译C C 43 43 Objective C Objective C
  • 用顺序表实现的简易通讯录(第一版)

    实现一个通讯录 xff1b 通讯录可以用来存储1000个人的信息 xff0c 每个人的信息包括 xff1a 姓名 性别 年龄 电话 住址 提供方法 xff1a 1 添加联系人信息 2 删除指定联系人信息 3 查找指定联系人信息 4 修改指定
  • ubuntu没有rc.local文件

    当我们设置开机自启时候 xff0c 一般都在rc local文件里设置 xff0c 但是有的Ubuntu版本没有这个文件 了 xff0c 此时我们可以自己创建一个 1 创建一个rc local service文件 sudo vim etc

随机推荐

  • 阿里云快速网站搭建详解

    一 网站建站流程 主要步骤 要有一个域名 购买主机 要有数据库 一般购买主机赠送 解析域名 下载网站程序 演示用的WordPress 上传程序 安装程序 配置数据库 网站基本信息 管理员信息等 二 DNS服务器快速入门 DNS服务概述 DN
  • OpenStack ussuri 私有云平台搭建

    一 OpenStack简介 openstack是一个云操作系统 这个操作系统控制着数据中心中的计算 存储和网络资源 所有这些资源的管理都是通过API来来实现的 并且管理资源都有相应的认证机制 在openstack中有一个叫做dashboar
  • 重磅!阿里版本【ChatGPT】开放测评!

    前两天突然爆出惊人消息 xff1a 阿里版ChatGPT开放测评了 xff01 在本月初 xff0c 已经有诸多关于阿里巴巴即将推出类似ChatGPT产品的传闻 数日前 xff0c 首批曝光的天猫精灵 鸟鸟分鸟 脱口秀版GPT基于大型模型的
  • debian-dhcp实验(傻瓜教程)

    安装apt get install y isc dhcp server 我这里已经安装过了 我们尝试启动服务端 xff0c 发现失败了 xff0c 这里因为我们没有绑定网卡 看一下网卡 我这是ens33 为了防止配置dhcp影响我的外网 x
  • 如何免费使用ChatGPT 4?

    自从ChatGPT发布以来 xff0c 它就取得了巨大的成功 无论是常春藤法学考试还是商学院作业 xff0c ChatGPT都被用于各种试验 统计数据显示 xff0c ChatGPT每月吸引约9600万用户 随着ChatGPT的巨大成功 x
  • 利用ChatGPT,一分钟制作思维导图

    大家好 xff0c 我是易安 xff01 今天我来教你如何使用ChatGPT xff0c 一分钟制作出一份思维导图 大纲选题 想到一个课题 xff0c 然后人工梳理出内容大纲 xff0c 是个挺费精力的事情 但利用ChatGPT来做这件事
  • 谈谈几种分布式锁实现

    大家好 xff0c 我是易安 xff01 今天我们呢谈一谈常见的分布式锁的几种实现方式 什么是分布式锁 在JVM中 xff0c 在多线程并发的情况下 xff0c 我们可以使用同步锁或Lock锁 xff0c 保证在同一时间内 xff0c 只能
  • 十分钟教你搭建类似ChatGPT的安卓应用程序

    大家好 xff0c 我是易安 xff01 Chat GPT 是当今著名的人工智能工具 xff0c 就像聊天机器人一样 Chat GPT会回答发送给它的所有查询 今天 xff0c 我将通过集成 OpenAI API ChatGPT 构建一个简
  • 十分钟教你搭建ChatGPT 图片生成的安卓应用

    十分钟教你搭建ChatGPT 图片生成的安卓应用 大家好 xff0c 我是易安 xff01 今天 xff0c 我们将集成 OpenAI API ChatGPT 来构建一个简单的类似 ChatGPT 的 android 应用程序 xff0c
  • 华为Java社招面试(已拿到offer)

    华为Java社招面试 xff08 已拿到offer xff09 之前8月底华为cloudsop部门打电话叫我要不要面试 xff0c 当时正处于换工作的期间 xff0c 于是就把简历发给华为hr xff0c 人事审核后经过一些列面试 机试 x
  • ubuntu 命令行编译qt程序

    关于在ubuntu安装qt可以参考正点原子的 I MX6U Qt交叉编译环境搭建V1 0 文档教程 xff0c 本文的最终目的是实现在ubuntu的命令终端中编译qt程序 从ubuntu的终端输入命令 xff1a qmake v xff0c
  • ubuntu 16.04 在使用apt-get install命令时出现:下列软件包有未满足的依赖关系错误

    1 出现错误的命令 xff1a sudo apt get install dpkg 2 出现的错误信息 xff1a 您可能需要运行 apt get f install 来纠正下列错误 xff1a 下列软件包有未满足的依赖关系 xff1a c
  • 输入两个正整数m和n,求其最大公约数和最小公倍数

    思路分析 xff1a 在循环中 xff0c 只要除数不等于0 xff0c 用较大数除以较小的数 xff0c 将小的一个数作为下一轮循环的大数 xff0c 取得的余数作为下一轮循环的较小的数 xff0c 如此循环直到较小的数的值为0 xff0
  • Latex中插入图片

    1 Latex的插图 在Latex中使用插图一般有两种方式 xff0c 一种是插入事先准备好的图片 xff0c 另一种是使用Latex代码直接在文档中画图 我们一般常见的使用都是第一种 xff0c 准备好图片 xff0c 然后直接插入在我们
  • debian部署docker(傻瓜式)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 debian10部署docker debian10部署docker xff08 傻瓜式 xff09 一 准备工作二 使用 APT 安装 x
  • Linux遇到Aborted (core dumped)

    1 问题描述 或出现 xff1a 2 关于Core Dump的分析 2 1 什么是Core Dump Core的意思是内存 Dump的意思是扔出来 堆出来 在开发 xff08 或使用 xff09 一个程序时 xff0c 有时程序莫名其妙的d
  • python工作目录和脚本存放目录不一样

    1 os getcwd 脚本文件所在位置D Code python TouTiao OS Path Dirname py xff0c 文件内容如下 xff1a working dir span class token operator 61
  • Latex/CTex/WinEdt 将参考文献设为上标引用,并加方括号

    工作环境 xff1a pdfTeX 3 1415926 2 3 1 40 12 MiKTeX 2 9 WinEdt 7 在LateX中 xff0c 参考文献的引用一般有两种方式 xff0c 平 齐 时 用 命 令 cite 上 标 时用 t
  • IDEA中报错:Invalid VCS root mapping

    1 错误 当打开从别的渠道获得的项目代码 xff0c 用IDEA打开出现 Invalid VCS root mapping The directory 的错误 2 分析 原因 xff1a 目录所示的git项目不存在 xff0c 导致这个报错
  • 重试机制 Retry

    文章目录 1 重试1 1 重试作用 2 重试的三种方法2 1 java retry2 2 spring retry2 3 guava retrying2 3 1 重试源2 3 2 自定义重试监听器 RetryListener2 3 3 停止