异步回调实现- Guava Retryer
为什么要使用重试利器Retryer
在实际开发中我们经常会遇到需要轮询查询一个接果,实现轮询的方式有很多种,我们经常要写许多代码,有时还会怕写出的代码有bug,如果已经有轮子了,我们就没必要重复造轮子了,毕竟时间有限,我们要挣钱。
github上开源的重试利器: https://github.com/rholder/guava-retrying
此retry是结合了Callable接口来实现,重试功能的,话不多说,直接上码。
重试利器maven配置
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
<version>2.0.0</version>
</dependency>
重试利器示例
1.如果想重试几次就结束轮询的话,可参考如下代码
package com.example.guava; 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.google.common.base.Predicates; import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; /**
* @author: GuanBin
* @date: Created in 下午4:30 2019/11/3
*/
public class RetryTest { public static void main(String[] args) {
//callable是定义具体的业务操作,并返回该操作结果的返回值
Callable<Boolean> callable = new Callable<Boolean>() {
public Boolean call() throws Exception {
return true; // do something useful here
}
}; //定义retryer,指定轮询条件,及结束条件
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfResult(Predicates.<Boolean>isNull())
.retryIfExceptionOfType(IOException.class)
.retryIfRuntimeException()
.withStopStrategy(StopStrategies.stopAfterAttempt(3))
.build();
try {
retryer.call(callable);
} catch (RetryException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
} }
retryer的条件是,callable的返回值是null或者有io异常或者运行时异常,则进行重试,重试次数为3次;
2.如果想以每隔一段时间的频率重试可参考如下代码
Retryer<TaskResult> getExecutionStatusRetryer = RetryerBuilder.<TaskResult>newBuilder()
.withWaitStrategy(WaitStrategies.fixedWait(5, TimeUnit.SECONDS))
.retryIfResult(r -> !Constants.completeStatus.contains(r.getStatus()))
.withStopStrategy(StopStrategies.neverStop())
.build();
WaitStrategies定义等待策略:示例是5秒一次就会轮询一次call的实现()
StopStrategies是定义停止轮询策略的,StopStrategies.neverStop() 若满足轮询条件的话,会一直进行重试下去
3.创建一个永久重试的重试器,在每次重试失败后以递增的指数退避间隔等待,直到最多5分钟。 5分钟后,每隔5分钟重试一次。
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfExceptionOfType(IOException.class)
.retryIfRuntimeException()
.withWaitStrategy(WaitStrategies.exponentialWait(100, 5, TimeUnit.MINUTES))
.withStopStrategy(StopStrategies.neverStop())
.build();
若第一次重试是100毫秒后重试,若进行第二次则是增加到200毫秒进行重试,依次类推,知道达到5分钟的上限,之后按照5分钟一次的频率进行重试
有兴趣的可参考 指数回退:https://en.wikipedia.org/wiki/Exponential_backoff
4.创建一个永久重试的重试器,在每次重试失败后以递增的退避间隔等待,直到最多2分钟。 2分钟后,每隔2分钟重试一次
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfExceptionOfType(IOException.class)
.retryIfRuntimeException()
.withWaitStrategy(WaitStrategies.fibonacciWait(100, 2, TimeUnit.MINUTES))
.withStopStrategy(StopStrategies.neverStop())
.build();
与指数等待策略类似,FibonacciWaitStrategy遵循的模式是每次尝试失败后等待时间增加。
FibonacciWaitStrategy是用斐波那契数列来计算等待时间,而不是指数函数。根据目前实践中发现,fibonacciwaitstrategy可能比指数waitstrategy有更好的性能和更好的吞吐量-至少根据不同回退算法在不同重播概率下的性能比较。
异步回调实现- Guava Retryer的更多相关文章
- Future 异步回调 大起底之 Java Future 与 Guava Future
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...
- 使用Guava retryer优雅的实现接口重调机制
API 接口调用异常, 网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次调用才能将其标识为错误并在确认错误之后发送异常提醒.guava-retry可以灵活的实现这一功能.Guava r ...
- Guava Retryer实现接口重试
前言 小黑在开发中遇到个问题,我负责的模块需要调用某个三方服务接口查询信息,查询结果直接影响后续业务逻辑的处理: 这个接口偶尔会因网络问题出现超时,导致我的业务逻辑无法继续处理: 这个问题该如何解决呢 ...
- node 异步回调解决方法之yield
先看如何使用 使用的npm包为genny,npm 安装genny,使用 node -harmony 文件(-harmony 为使用es6属性启动参数) 启动项目 var genny= require( ...
- c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调
单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...
- Android异步回调中的UI同步性问题
Android程序编码过程中,回调无处不在.从最常见的Activity生命周期回调开始,到BroadcastReceiver.Service以及Sqlite等.Activity.BroadcastRe ...
- java 中的异步回调
异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...
- C“中断” 与 JS“异步回调” 横向对比
在底层C语言中,有一个非常重要而特别的概念,叫做“中断”.用比喻来说,我正在写着博客,突然我妈打个电话过来,我就离开了键盘去接电话了,然后写博客就中断了,我聊完电话回来再继续写.乍一听似乎并没有什么大 ...
- State Threads——异步回调的线性实现
State Threads——异步回调的线性实现 原文链接:http://coolshell.cn/articles/12012.html 本文的标题看起来有点拗口,其实State Threads库就 ...
随机推荐
- CS5265替代CH7211|Capstone CS5265芯片|替代CH7211芯片
龙迅Chrontel的CH7211是一款Type-C转HDMI2.0半导体设备,可通过USB Type-C连接器将DisplayPort信号转换为HDMI/DVI.这款创新的基于USB Type-C的 ...
- Android物联网应用程序开发(智慧园区)—— 登录界面开发
效果: 布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
- 使用 DDL 语句分别创建仓库表、供应商表、产品表和入库表,并对其进行操作
查看本章节 查看作业目录 需求说明: 使用 DDL 语句分别创建仓库表.供应商表.产品表和入库表 使用 DML 语句分别新增一条仓库表.供应商表.产品表和入库表记录 使用 DML 语句更新满足指定条件 ...
- 使用 jQuery对象设置页面中 <ul> 元素的标记类型,并使用 DOM 对象设置 <li> 元素的浮动属性和右边距。使用jQuery 对象和 DOM 对象设置页面元素属性
查看本章节 查看作业目录 需求说明: 使用 jQuery对象设置页面中 <ul> 元素的标记类型,并使用 DOM 对象设置 <li> 元素的浮动属性和右边距.使用jQuery ...
- .Net Core 3.1 WebApi使用Swagger生成Api文档
用swagger生成Api文档 1.安装Swashbuckle.AspNetCore 右键单击"解决方案资源管理器" > "管理 NuGet 包"中的项目 ...
- SpringCloud创建Eureka Client服务注册
1.说明 本文详细介绍微服务注册到Eureka的方法, 即Eureka Client注册到Eureka Server, 这里用任意一个Spring Cloud服务为例, 比如下面已经创建好的Confi ...
- docker简单安装
docker的安装官网有很直接的教程,直达链接: Ubuntu:https://docs.docker.com/engine/install/ubuntu/ CentOS:https://docs.d ...
- EntityFrameworkCore数据迁移(一)
.net core出来已经有很长一段时间了,而EentityFrameworkCore(后面简称EFCore)是.net framework的EntityFramework在.net core中的实现 ...
- Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方
市面上常见的摄像头悬浮窗,如微信.手机QQ的视频通话功能,有如下特点: 整屏页面能切换到一个小的悬浮窗 悬浮窗能运行在其他app上方 悬浮窗能跳回整屏页面,并且悬浮窗消失 我们探讨过用CameraX打 ...
- Redis OM .NET Redis对象映射框架
Redis OM Redis OM 是 Redis 官方推出的对象映射框架,即:Object Mapping.让开发人员更简单.方便的操作 Redis 数据.Redis 存储的数据抽象为对象映射,支持 ...