应用中需要实现一个功能: 需要将

常规解决方案

try-

在包装正常上传逻辑基础上,通过判断返回结果或监听异常决定是否重试,同时为了解决立即重试的无效执行(假设异常是有外部执行不稳定导致的:网络抖动),休眠一定延迟

public vo

try-catch-redo-

上述方案还是有可能重试无效,解决这个问题尝试增加重试次数 retrycount 以及重试间隔周期 interval ,达到增加重试有效的可能性。

public void commonRetry(Map dataMap) throws InterruptedException {

Map paramMap = Maps.newHashMap();

paramMap.put("tableName", "creativeTable");

paramMap.put("ds", "20160220");

paramMap.put("dataMap", dataMap);

boolean result = false;

try {

result = uploadToOdps(paramMap);

if (!result) {

reuploadToOdps(paramMap,1000L,10);//延迟多次重试

}

} catch (Exception e) {

reuploadToOdps(paramMap,1000L,10);//延迟多次重试

}

}

复制代码

方案一和方案二存在一个问题:正常逻辑和重试逻辑强耦合,重试逻辑非常依赖正常逻辑的执行结果,对正常逻辑预期结果被动重试触发,对于重试根源往往由于逻辑复杂被淹没,可能导致后续运维对于重试逻辑要解决什么问题产生不一致理解。重试正确性难保证而且不利于运维,原因是重试设计依赖正常逻辑异常或重试根源的臆测。

优雅重试方案尝试

应用命令

命令设计模式具体定义不展开阐述,主要该方案看中

IRetry约定了上传和重试接口,其实现类OdpsRetry封装ODPS上传逻辑,同时封装

而我们的调用者LogicClient无需关注重试,通过重试者Retryer实现约定接口功能,同时 Retryer需要对重试逻辑做出响应和处理, Retryer具体重试处理又交给真正的IRtry接口的实现类OdpsRetry完成。通过采用命令模式,优雅实现正常逻辑和重试逻辑分离,同时通过构建重试者角色,实现正常逻辑和重试逻辑的分离,让重试有更好的扩展性。

使用Guava retryer优雅的实现接口重调机制

Guava retryer工具与

Maven POM 引入

2.0.0

com.

定义实现Callable接口的方法,以便Guava retryer能够调用

private static Callable

定义Retry对象并设置相关策略

Retryer retryer = RetryerBuilder.newBuilder()

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

.retryIfException()

//返回false也需要重试

.retryIfResult(Predicates.equalTo(false))

//重调策略

.withWaitStrategy(WaitStrategies.fixedWait(10, TimeUnit.SECONDS))

//尝试次数

.withStopStrategy(StopStrategies.stopAfterAttempt(3))

.

简单三步就能使用Guava Retryer优雅的实现重调方法。

更多特性

RetryerBuilder是一个Factory创建者,可以自定义设置重试源且支持多个重试源,可以Exception异常对象 和 自定义断言对象 ,通过 retryIfException 和retryIfResult 设置,同时支持多个且能兼容。

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

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

retryIfExceptionOfType :允许我们只在发生特定异常的时候才重试,比如NullPointerException和IllegalStateException都属于runtime异常,也包括自定义的error 如:

# 只在抛出error重试

retryIfExceptionOfType(Error.class)

# 只有出现指定的异常的时候才重试,如:

retryIfExceptionOfType(IllegalStateException.class)

retryIfExceptionOfType(NullPointerException.class)

# 或者通过Predicate实现

retryIfException(Predicates.or(Predicates.instanceOf(NullPointerException.class),

Predicates.instanceOf(IllegalStateException.class)))

复制代码

retryIfResult可以指定你的Callable方法在返回值的时候进行重试,如

// 返回false重试

retryIfResult(Predicates.equalTo(false))

//以_error结尾才重试

retryIfResult(Predicates.containsPattern("_error$"))

复制代码

当发生重试之后,假如我们需要做一些额外的处理动作,比如发个告警邮件啥的,那么可以使用 RetryListener 。每次重试之后,guava-retrying会自动回调我们注册的监听。也可以注册多个RetryListener,会按照注册顺序依次调用。

import com.github.rholder.retry.Attempt;

import com.github.rholder.retry.RetryListener;

import

接下来在Retry对象中指定监听: withRetryListener(new MyRetryListener<>())

java 超时重试机制_Java之Retry重试机制详解相关推荐

  1. java读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

  2. java编程50实例_java编程实例大全及详解谜底(50例).doc

    java编程实例大全及详解谜底(50例).doc 还剩 33页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 谓 ...

  3. java list 移除_java 中List删除实例详解

    java 中List删除实例详解 1.循环删除List中的元素 public static void main(String[] args) { List t=new ArrayList(); for ...

  4. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

  5. java做jsp问题_java/jsp中 中文问题详解

    java/jsp中 中文问题详解 更新时间:2006年10月13日 00:00:00   作者: 预备知识: 1.字节和unicode Java内核是unicode的,就连class文件也是,但是很多 ...

  6. java 读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

  7. java 自定义异常实例分析_Java自定义异常类的实例详解

    Java自定义异常类的实例详解 为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写.我们常用的类ArithmeticException,NullPointerException,Ne ...

  8. java使用变量输出_JAVA定义变量与输出详解

    一些重要知识 一个源文件里只能有一个public类,其它类数量不限.文件名与public类名相同 java程序严格区分大小写 JAVA应用程序的执行入口是main方法固定写法:public stati ...

  9. java闰年判断原理_java 面试题闰年判断详解及实例

    java 面试题闰年判断详解及实例 java 闰年判断 前言: 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍数: 2. 年份是400 ...

最新文章

  1. MVC3学习 四 EF删除操作
  2. 云网融合 — 电信网络云
  3. jenkins内存溢出的一些解决过程
  4. Nginx的动态代理,负载均衡,动静分离的简单使用
  5. IP网络设计系列之-局域网设计
  6. C# 读写Ini文件
  7. 验证字符串是否回文 Valid Palindrome
  8. matlab光束,matlab仿真光束的传输特性
  9. linux日志清除脚本,linux 日志清除脚本
  10. Rails5 任务注释
  11. matlab进行道格拉斯筛选,柯布-道格拉斯(Cobb-Douglas)生产函数模型.doc
  12. Sun选择Emulex助力完善Blade服务器
  13. 吉比特2018校招 走格子游戏
  14. 利用几何布朗运动模型预测股票价格_20200514_
  15. r语言决策树c4.5案例,C4.5主要思想与决策树实例
  16. Python中文社区开源项目计划:ImagePy
  17. Windows10莫名其妙多了个CD驱动器,删除方法记录
  18. JSFL批量删除fla文件中超出某个宽度的原件
  19. 《probabilistic robotics》学习笔记——卡尔曼滤波
  20. 如何解决缓存雪崩、击穿、穿透难题?

热门文章

  1. win10安装微信开发者工具提示“installer integrity check has failed”处理方法
  2. 高斯过程回归 | Matlab实现高斯过程回归多输入单输出预测(Gaussian Process Regression)
  3. python数据录入系统数据库处理导出_Python以太坊区块链交互将数据存入数据库
  4. 深入iOS系统底层之指令集介绍
  5. 为什么许多公司电脑系统都是win10家庭版而不是专业版?
  6. 模拟预约图书馆占座爬虫
  7. 贴标机及其控制系统【贴合,定位,检测】
  8. 杭州最新公交线路一览(31-40)
  9. Go在广发证券分布式行情和交易系统的应用和实践
  10. SAS MACRO Debugging option