失败重试策略
来源:互联网 发布:org.apache.http post 编辑:程序博客网 时间:2024/06/06 20:24
简介
自己封装的失败重试策略,比较适合访问网络或者蓝牙通信的时候任务失败重试,当失败次数达到预定的次数之后,就会提示本次任务失败。
以下是代码的结构:
RetryPolicyI是失败重试接口;
AbstractRetryPolicy继承了接口,并实现了任务执行重试的逻辑;
FixedRetryPlicy固定时间的重试;
LinearRetryPlicy线性增加时间的重试;
RandomRetryPolicy随机时间的重试;
重试接口和抽象类
RetryPolicyI
public interface RetryPolicyI { void tryCall(Callable<Void> callable,Class<? extends Throwable> exception) throws Exception;}
AbstractRetryPolicy
当请求失败,如果请求次数小于最多尝试的次数,则先等待一段时间再继续执行;如果已经超过了最多尝试次数,则直接抛出异常,执行失败。
public abstract class AbstractRetryPolicy implements RetryPolicyI { private String tag = "AbstractRetryPolicy"; private int maxAttempts;//最多尝试次数 public AbstractRetryPolicy(int maxAttempts) { this.maxAttempts = maxAttempts; } @Override public void tryCall(Callable<Void> callable, Condition condition, Class<? extends Throwable> exception) throws Exception { int attempts = 0; while (attempts <= maxAttempts) { try { LogUtil.getInstance().ilog(tag,"第"+attempts+"次call"); callable.call(); break; } catch (Exception e) { LogUtil.getInstance().elog(tag,"retry请求出现异常"+e); attempts++; if ((exception != null) && (exception.isAssignableFrom(e.getClass())) && !(attempts >= maxAttempts)) { Thread.sleep(getDelay(attempts)); LogUtil.getInstance().ilog(tag,"retry异常,重新请求"); } else { LogUtil.getInstance().elog(tag,"请求失败,抛出异常 "+e); throw e; } } } } protected abstract long getDelay(int attempts);}
具体重试实现
等待固定时间重试
根据传入的initialDelay参数来确定等待时间。
public class FixedRetryPolicy extends AbstractRetryPolicy{ private long initialDelay; public FixedRetryPolicy(int maxAttempts,long initialDelay) { super(maxAttempts); this.initialDelay = initialDelay; } @Override protected long getDelay(int attempts) { return initialDelay; }}
等待时间线性增加
等待的时间为:固定等待时间*尝试次数,尝试越多次,等待时间越久。
public class LinearRetryPolicy extends AbstractRetryPolicy { private long initialDelay; public LinearRetryPolicy(long initialDelay, int maxAttempts) { super(maxAttempts); this.initialDelay = initialDelay; } @Override protected long getDelay(int attempts) { return attempts * initialDelay; }}
随机等待时间
每次等待时间是最长等待时间和最短等待时间中间的一个值。
public class RandomRetryPolicy extends AbstractRetryPolicy{ private long min; private long max; public RandomRetryPolicy(int maxAttempts,long min,long max){ super(maxAttempts); this.min = min; this.max = max; } @Override protected long getDelay(int attempts) { long delay = (long)(Math.random()*(max - min)) + min; return delay; }}
总结
非常简单又好用的一个失败重试策略框架,还可以在此基础上增加超时的功能,当任务执行超过预定的时间之后,可以抛出异常,表示本次任务执行失败,继续下一个任务的执行。
阅读全文
0 0
- 失败重试策略
- node js- 路由转发和失败重试策略
- Volley超时重试策略_RetryPolicy
- io_setup 重试5次失败
- oozie 失败重试和报警
- kafka消费失败多次重试
- ImageLoader 框架 图片下载失败重试
- 【Jsoup in action】模拟浏览器:Jsoup工具类的使用及失败重试的retry策略(三)
- android初学------ volley学习-重试请求策略
- Azure Storage Client Library 重试策略建议
- 重温Volley源码(二):重试策略
- 优酷“连接失败,请稍后重试”
- 三次登录失败停留15秒才可重试
- pyunit扩展:自动重试失败用例
- 乐观锁更新失败重试解决方案
- Part2:Volley请求失败的重试机制
- 失败重试的一种实现方式
- repo sync失败后自动重试
- python 线程理解
- 下拉复选框
- Qt见解:Post 与 Get 的区别(Get将参数直接与网址整合为一个整体,而Post则将其拆为两个部分)
- leetcode: 538. Convert BST to Greater Tree
- ???题目3 : Matrix
- 失败重试策略
- 向github上push代码
- The Accomodation of Students HDU
- 线段树·P1247贪婪大陆
- 测试微信营销2
- jquery 自带表单验证 validate 自定义验证
- 新的开始新的未来!
- js中new Date()只取日期或者只取时间值以及在原有日期向后推10天
- Nginx的配置