当前位置: 首页 > news >正文

Java 开源重试类 guava-retrying 使用案例

使用背景

需要重复尝试执行某些动作,guava-retrying 提供了成型的重试框架

依赖

        <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>${retrying.version}</version><exclusions><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions></dependency>

${retrying.version} 实际为 2.0.0

如果已有 guava 缓存框架引入则可以像上面一样去除,否则可以保留

定义工具类

import com.github.rholder.retry.Attempt;
import com.github.rholder.retry.RetryListener;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.StopStrategy;
import com.github.rholder.retry.WaitStrategies;
import com.google.common.base.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.time.StopWatch;import java.text.MessageFormat;
import java.util.Optional;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;@Slf4j
public class RetryUtil {private RetryUtil(){}/*** 根据输入的condition重复做task,在规定的次数内达到condition则返回,* 如果超过retryTimes则返回null, 重试次数,整个重试时间以及retry exception都会记录log* 需要注意调用的时候需要新起一个线程,不然重试失败会阻塞当前线程** @param condition  重试条件,比如接口返回errorCode为处理中,或不是最终需要的结果* @param task       重试做的任务* @param sleepTime  重试间隔时间,单位毫秒* @param retryTimes 最大重试次数* @return targetBean*/public static <V> Optional<V> retry(Predicate<V> condition, Callable<V> task, int sleepTime, Integer retryTimes) {Optional<V> result = Optional.empty();StopStrategy stopStrategy = null;if (retryTimes == null) {stopStrategy = StopStrategies.neverStop();} else {stopStrategy = StopStrategies.stopAfterAttempt(retryTimes);}StopWatch stopWatch = new StopWatch();try {stopWatch.start();Retryer<V> retry = RetryerBuilder.<V>newBuilder()// 默认任务执行过程中发生异常自动重试.retryIfException()// 重试条件(按照业务场景).retryIfResult(condition)// 等待策略.withWaitStrategy(WaitStrategies.fixedWait(sleepTime, TimeUnit.MILLISECONDS))// 重试策略.withStopStrategy(stopStrategy)// 重试监听器.withRetryListener(new RetryListener() {@Overridepublic <V> void onRetry(Attempt<V> attempt) {// 记录重试次数和异常信息log.info(MessageFormat.format("{0}th retry", attempt.getAttemptNumber()));if (attempt.hasException()) {log.error(MessageFormat.format("retry exception:{0}", attempt.getExceptionCause()));}}}).build();// 开始执行重试任务result = Optional.ofNullable(retry.call(task));} catch (Exception e) {log.error("retry fail:", e);} finally {stopWatch.stop();log.info("retry execute time" + stopWatch.getTime());}return result;}
}

实际使用

    private void xxxxXxxxx() {Predicate<Boolean> condition = result -> result;RetryUtil.retry(condition::test,() -> xxxxxxService.xxxxXxxx(),60000,60);}

其中 xxxxxxService.xxxxXxxx() : 方法为要重试的内容,同时改方法要返回
在这里插入图片描述
条件的指定类型。

第一个为入参为重试条件。

60000 代表重试时间间隔,单位 毫秒

60 标识重试次数

相关文章:

  • azkaban二次开发
  • 网工内推 | 字节原厂,正式编,网络工程师,最高30K*15薪
  • 拒绝服务攻击工具的编写
  • 持续集成部署-k8s-配置与存储-配置管理:SubPath
  • C++基础从0到1入门编程(三)
  • Ghidra逆向工具配置 MacOS 的启动台显示(Python)
  • 2023年【T电梯修理】考试题及T电梯修理考试报名
  • 2023年【施工升降机司机(建筑特殊工种)】最新解析及施工升降机司机(建筑特殊工种)考试资料
  • 笔记54:门控循环单元 GRU
  • kubeadm join 192.168.10.16:6443 --token xxx报错Failed to request cluster-info
  • YOLO目标检测——无人机航拍输电线路绝缘瓷瓶数据集下载分享【对应voc、coco和yolo三种格式标签】
  • ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】
  • 图形编辑器开发:自定义光标管理
  • 利用SVD对图像进行压缩
  • SpringDoc基础配置和集成OAuth2登录认证教程
  • [Vue CLI 3] 配置解析之 css.extract
  • 【刷算法】从上往下打印二叉树
  • Android 架构优化~MVP 架构改造
  • docker-consul
  • GraphQL学习过程应该是这样的
  • Javascript基础之Array数组API
  • Java反射-动态类加载和重新加载
  • js作用域和this的理解
  • Linux链接文件
  • React的组件模式
  • Shadow DOM 内部构造及如何构建独立组件
  • SpriteKit 技巧之添加背景图片
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 每天一个设计模式之命令模式
  • 目录与文件属性:编写ls
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我与Jetbrains的这些年
  • 2017年360最后一道编程题
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 第二十章:异步和文件I/O.(二十三)
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​iOS安全加固方法及实现
  • #includecmath
  • #NOIP 2014#Day.2 T3 解方程
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (轉)JSON.stringify 语法实例讲解
  • .Mobi域名介绍
  • .net 4.0发布后不能正常显示图片问题
  • .net 调用php,php 调用.net com组件 --
  • .net 提取注释生成API文档 帮助文档
  • .NET企业级应用架构设计系列之应用服务器
  • .net项目IIS、VS 附加进程调试
  • .net中生成excel后调整宽度