1 概述
在日常开发中经常会遇到通过 http 请求获取接口数据,由于网络问题导致请求失败,这时需要重试机制在请求失败后自动重试。
比如:给用户发送确认邮件失败,需要自动重试;发送短信失败,需要自动重试等场景。
2 Maven 依赖
1 | <dependency> |
- com.ckjava.xutils.WaitUtils
3 方法介绍
等待工具类,以 阻塞/非阻塞的方式 通过在 while 中的循环次数或者超时时间来控制程序的执行。
- waitThen(Predicate, long, Runnable, Runnable): 当 Predicate 对象在超时前满足 某个条件 的时候才会执行 successRunnable 对象的 run 方法, 否则执行 failRunnable 对象的 run 方法
- waitThenAsync(Predicate, long, Runnable, Runnable, ExecutorService): 以异步的方式, 当 Predicate 对象在超时前满足 某个条件 的时候才会执行 successRunnable 对象的 run 方法, 否则执行 failRunnable 对象的 run 方法
- waitThen(Predicate, int, Runnable, Runnable): 当 Predicate 对象在 重试次数大于 0 前 的时候才会执行 successRunnable 对象的 run 方法,否则执行 failRunnable 对象的 run 方法
- waitThenAsync(Predicate, int, Runnable, Runnable, ExecutorService): 以非阻塞的方式,当 Predicate 对象在 重试次数大于 0 前 的时候才会执行 successRunnable 对象的 run 方法,否则执行 failRunnable 对象的 run 方法
- waitUntil(Predicate, long): Predicate 对象必须在 超时前 满足某个条件 否则退出阻塞
- waitUntilAsync(Predicate, long, ExecutorService): 以异步的方式, Predicate 对象必须在 超时前 满足某个条件 否则退出阻塞
- waitUntil(Predicate, int): Predicate 对象必须在 重试次数大于 0 前 满足某个条件 否则退出阻塞
- waitUntilAsync(Predicate, int, ExecutorService): 以非阻塞的方式, Predicate 对象必须在 重试次数大于 0 前 满足某个条件 否则退出阻塞
测试
- 在 Predicate 对象中自动生成数字,满足条件后再返回 true 并退出 while 循环,针对 WaitUtils 工具类中的 8 个方法测试如下
1 | import com.ckjava.synchronizeds.appCache.WaitUtils; |
4 使用场景
1. waitUntil(Predicate, int) 方法:通过 api 获取数据,如果失败,最多重试 3 次;利用 AtomicReference 对象存储方法的执行结果
- 以阻塞的方式从 api 获取数据,如果 出错 或者 不能获取到数据 重试 3 次
1 | AtomicReference<JSONObject> atomicReference = new AtomicReference<>(); |
- 封装 getAppData 方法,如果成功将数据存储到 AtomicReference 对象中并返回,具体如下
1 | private boolean getAppData(AtomicReference<JSONObject> atomicReference) { |
2. waitUntilAsync(Predicate, int, ExecutorService) 方法:发送邮件,如果失败,在一个独立的线程内自动重试 10 次
- 新增缓存类型的线程池如下
1 | "commonThreadService") ( |
- 通过 waitUntilAsync 方法,并且使用 commonThreadService 线程池,并封装 doSendMail 方法作为 Predicate 对象的实现,doSendMail 将会以异步的方式执行,如果出错将会重试 10 次。
1 | "commonThreadService") ( |