Guava-retry,java重试组件
使用场景
在日常开发中,我们经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务是否存活。
Guava Retrying 是一个灵活方便的重试组件,包含了多种的重试策略,而且扩展起来非常容易。
用作者的话来说:
This is a small extension to Google’s Guava library to allow for the creation of configurable retrying strategies for an arbitrary function call, such as something that talks to a remote service with flaky uptime.
使用 Guava-retrying 你可以自定义来执行重试,同时也可以监控每次重试的结果和行为,最重要的基于 Guava 风格的重试方式真的很方便。
网上关于guava-retrying的介绍很多,我就不赘述了,这里有一篇写的比较好的文章:
在此基础上我封装了一个Util:
/**
 * Created by libing6@xiaomi.com on 18-7-12.
 */
@Log4j2
public class RetryUtil {
	//出现异常则执行重试,每次任务执行最长执行时间限定为 3 s,重试间隔时间初始为 3 s,最多重试 10秒,随着重试次数的增加每次递增 1 s,每次重试失败,打印日志;
	public static <T> Retryer<T> getADefaultRetryer() {
		Retryer<T> retryer = RetryerBuilder.<T>newBuilder()
			.retryIfException()
			.withStopStrategy(
				StopStrategies.stopAfterDelay(10, TimeUnit.SECONDS))
			.withWaitStrategy(
				WaitStrategies.incrementingWait(3, TimeUnit.SECONDS, 1, TimeUnit.SECONDS))
			.withAttemptTimeLimiter(
				AttemptTimeLimiters.fixedTimeLimit(3, TimeUnit.SECONDS))
			.withRetryListener(new RetryListener() {
				@Override
				public <V> void onRetry(Attempt<V> attempt) {
					log.debug("retry time = " + attempt.getAttemptNumber());
					if (attempt.hasException()) {
						log.error("try failed", attempt.getExceptionCause());
					}
				}
			})
			.build();
		return retryer;
	}
	// Todo 可以定制参数
}
使用方法仅需一句话:
RetryUtil.<String>getADefaultRetryer()
			.call(() -> getClient().getDataById(id));
												
											Guava-retry,java重试组件的更多相关文章
- 【Guava】基于guava的重试组件Guava-Retryer
		
一.使用场景 在日常开发中,我们经常会遇到需要调用外部服务和接口的场景.外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失 ...
 - 更好的 java 重试框架 sisyphus 背后的故事
		
sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 今天,让我们一起看一下西西弗斯背后的故事. 情景导入 简单的需求 产品经理:实现一个 ...
 - 更好的 java 重试框架 sisyphus 入门简介
		
What is Sisyphus sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 为什么选择这个名字 我觉得重试做的事情和西西弗斯很 ...
 - 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍
		
回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 背后的故事 这一节让我们一起学习下 sisyphus 基于函数式的配置和注解 ...
 - 更好的 java 重试框架 sisyphus 的 3 种使用方式
		
回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍 更好的 java 重试框架 sisyphus 背后的 ...
 - 在 Java EE 组件中使用 Camel Routes
		
摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes. [编者按]作者 ...
 - Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新
		
Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...
 - Java基础组件快速入门
		
最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜.现在手头的工作基本完成了,因此打算好好来归纳下java的相关工具库,将来需要借助你们,好 ...
 - java日志组件介绍(common-logging,log4j,slf4j,logback )
		
转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...
 
随机推荐
- TCP:与UDP区别、三次握手、四次挥手、Socket 编程
			
1. TCP 基本认识 TCP 头部格式 为什么需要 TCP 协议?TCP 工作在哪一层? 什么是 TCP ? 什么是 TCP 连接? 如何唯一确定一个 TCP 连接呢? 有一个 IP 的服务器监听了 ...
 - 已知a=a
			
高中时酷爱经济学. 薄薄的纸片竟然决定着整个社会的运转趋势,整个人生的起伏也是靠着纸片来衡量的. 可笑的是你怎么闹腾也逃不过康波周期等一系列命中注定的路线,即,已知a=a,那么a等于且仅等于a. 所有 ...
 - CentOS8 安装 MySQL8.0(yum)
			
1.Mysql 官网下载 RPM 包wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm2.检查是否已安装 ...
 - Android进程的so注入--Poison(稳定注入版)
			
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53869796 Android进程的so注入已经是老技术了,网上能用的Android ...
 - UVA11384正整数序列(把123..变成0的最小步数)
			
题意: 给定一个正整数n,你的任务是最少的操作次数把序列1 2 3 4 5...n中所有的数字都变成0,每次操作可以从序列中选择一个活多个整数,同时减去一个相同的正整数,比如 1 2 3可以 ...
 - Win64 驱动内核编程-24.64位驱动里内嵌汇编
			
64位驱动里内嵌汇编 讲道理64位驱动是不能直接内链汇编的,遇到这种问题,可以考虑直接把机器码拷贝到内存里,然后直接执行. 获得机器码的方式,可以写好代码之后,直接通过vs看反汇编,然后根据地址在看内 ...
 - 初探 Git Submodules
			
之前一直想将一个 Git 仓库放到另一个 Git 仓库,有 Maven 多模块项目(Maven Multimodule Project)和 Gradle 多项目构建(Gradle Multiproje ...
 - 一个或多个筛选器或者Listeners启动失败 的问题探索以及解决方案
			
2020年10月9日更新 经过本人对SSM框架理解的加深和对IDEA工具使用的熟悉,现提出一种新的解决办法,以前的解决办法可能存在问题 1. 问题描述: 使用IDEA作为开发工具,使用Maven作为项 ...
 - JAVA连接、操作数据库的DBHelper
			
工厂模式的DBHelper 1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.Prepa ...
 - v-for详解
			
v-for的引入 当我们需要对一组数据进行渲染时,我们就可以使用v-for来完成 v-for遍历数组 格式:v-for="(item, index) in items".(也许是因 ...