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 标识重试次数
相关文章:
Java 开源重试类 guava-retrying 使用案例
使用背景 需要重复尝试执行某些动作,guava-retrying 提供了成型的重试框架 依赖 <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>${retrying.version}</version>…...
服务器 jupyter 文件名乱码问题
对于本台电脑,autodl服务器,上传中文文件时,从压缩包名到压缩包里的文件名先后会出现中文乱码的问题。 Xftp 首先是通过Xftp传输压缩包到Autodl服务器: 1、打开Xftp,进入软件主界面,点击右上角【文件】菜…...
Ubuntu设设置默认外放和麦克风设备
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pulseaudio 是什么?二、配置外放1.查看所有的外放设备2.设定默认的外放设备3.设定外放设备的声音强度4.设定外放设备静音 三、配置麦克风1.查看…...
【教程】Sqlite迁移到mysql(django)
1、先将sqlite db文件导出sql sqlite3 db.sqlite3 .dump>output.sql db.sqlite3 是 sqlite 数据库文件 output.sql是导出sql文件的名称 2、sql文件转换、处理 sed s/AUTOINCREMENT/AUTO_INCREMENT/g output.sql | sed s/datetime/timestamp/g | sed s/INTEGER/int/g &g…...
【漏洞复现】DPTech VPN存在任意文件读取漏洞
漏洞描述 DPtech是在网络、安全及应用交付领域集研发、生产、销售于一体的高科技企业。DPtech VPN智能安全网关是迪普科技面向广域互联应用场景推出的专业安全网关产品,集成了IPSec、SSL、L2TP、GRE等多种VPN技术,支持国密算法,实现分支机构…...
CentOS 8搭建WordPress
步骤 1: 更新系统 确保你的系统是最新的,使用以下命令更新: bashCopy code sudo dnf update 步骤 2: 安装Apache bashCopy code sudo dnf install httpd 启动Apache,并设置开机自启动: bashCopy code sudo systemctl star…...
服务器安全防护导致使用多款行业顶尖软件搭配使用,还是单独一款解决呢?
如今,在全球各地,数以千计的公司、组织和个人都依赖于服务器来存储和访问重要数据,托管应用程序,以及提供服务。但是,这些服务器不断面临着来自网络黑客的威胁,因此服务器的安全成为了当务之急。 在这种情…...
【Spring篇】Spring注解式开发
本文根据哔哩哔哩课程内容结合自己自学所得,用于自己复习,如有错误欢迎指正; 我在想用一句话激励我自己努力学习,却想不出来什么惊为天人、精妙绝伦的句子,脑子里全是上课老师想说却没想起的四个字 “ 唯手熟尔 ”&am…...
14.(vue3.x+vite)组件间通信方式之pinia
前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…...
DolphinDB 浙商银行 | 第二期现场培训圆满结束
自 DolphinDB 高级工程师计划开展以来,客户们纷纷响应,除了定期收看我们每周三开设的线上公开课外,也有部分客户报名参加了 “总部工程师培训计划” 。 上周,我们迎来了总部培训的第二期学员:来自浙商银行的4位策略研…...
DBS note4:Buffer Management
目录 1、介绍 2、缓冲池 3、处理页面请求 4、LRU替换和时钟策略 1)顺序扫描性能 - LRU 5、最近最常使用替换策略(MRU Replacement) 1)Sequential Scanning Performance - MRU 6、练习题 1)判断真假 2…...
Linux 中 .tar 和 tar.gz 的区别
1、前言 有时候你会发现,即便是有些拥有 3 年左右工作经验的运维或开发工程师对 .tar 和 .tar.gz 的区别并不是很清楚。.tar 和 .tar.gz 是在 Linux 系统中用于打包和压缩文件的两种常见格式。它们之间的主要区别在于压缩算法和文件扩展名。 2、区别 .tar .tar 是…...
区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用
视频AI智能分析已经渗透到人类生活及社会发展的各个方面。从生活中的人脸识别、停车场的车牌识别、工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品的品质缺陷AI检测等,AI智能分析技术无处不在。在某些场景中,重点区域的人数统计与…...
asp.net mvc点餐系统餐厅管理系统
1. 主要功能 ① 管理员、收银员、厨师的登录 ② 管理员查看、添加、删除菜品类型 ③ 管理员查看、添加、删除菜品,对菜品信息进行简介和封面的修改 ④ 收银员浏览、搜索菜品,加入购物车后进行结算,生成订单 ⑤ 厨师查看待完成菜品信息…...
SpringBoot 使用多SqlSessionFactory下的事务问题
如下配置了两个数据源: spring:datasource:ds1:jdbc-url: jdbc:mysql://localhost:3307/spring-boot-demos?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8&useSSLfalse&allowPublicKeyRetrievaltrueusername: rootpassword: passwordd…...
浏览器内置NoSQL数据库IndexedDB
IndexedDB - 浏览器内容数据库 indexedDB 是一种浏览器内置的NoSQL数据库,它使用键值对存储数据,用于在客户端存储大量结构化数据。它支持离线应用程序和高效的数据检索,可以在 Web 应用程序中替代传统的 cookie 和 localStorage。 IndexDB是…...
网络参考模型与标准协议(二)-TCP/IP对等模型详细介绍
应用层 应用层为应用软件提供接口,使应用程序能够使用网络服务。应用层协议会指定使用相应的传输层协议,以及传输层所使用的端口等。TCP/IP每一层都让数据得以通过网络进行传输,这些层之间使用PDU ( Paket Data Unit,协议数据单元)彼此交换信…...
万宾科技智能井盖传感器,预防城市道路安全
随着城市交通的不断发展和城市化进程的加速推进,城市道路安全问题日益凸显。市政井盖作为城市道路的一部分,承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施,补足传统管理方式的…...
GCC/Make/CMake 工具链
阅读前可以思考的问题:(答案在文章的最后面,小白可以略过) GCC/Make/CMake是什么关系? 一个C程序编译为一个可执行文件,需要哪些过程? #include语句所引入的库,如何才能找到对应的完整源代码文…...
GO抽象工厂模式
既然工厂模式每个产品都需要实现对应的工厂类去生成相关实例,提取产品的共性,提高代码的内聚性, 就是抽象工厂模式要干的。在抽象工厂中,依然是不同产品对应不同的工厂类,但可以尽可能将具有相同共性的产品类别合在一起…...
国产替代之FQD6N40TM与VBE14R04参数对比报告
N沟道功率MOSFET参数对比分析报告一、产品概述FQD6N40TM:安森美(onsemi)N沟道硅MOSFET,采用QFET技术,耐压400V,具有低导通电阻和快速开关性能。封装:DPAK (TO-252)。适用于开关电源、DC-DC转换器…...
初次使用Taotoken从注册到完成第一个API调用的全过程记录
初次使用Taotoken从注册到完成第一个API调用的全过程记录 作为一名开发者,初次接触一个新的API服务平台时,最关心的往往是上手过程是否顺畅。最近,我尝试了Taotoken平台,完整记录了从零开始到成功调用大模型API的全过程。这篇记录…...
EBERLE S-41/051413016000印刷电路板
EBERLE S-41/051413016000 通常属于其工业自动化系统中的印刷电路板(PCB)组件 根据此类专用电路板的通用特性,推测其特点如下:定制化设计:推测是针对特定控制任务(如信号转换、电源管理或接口扩展ÿ…...
终极React-Redux开源贡献指南:从新手到贡献者的完整路径
终极React-Redux开源贡献指南:从新手到贡献者的完整路径 【免费下载链接】react-redux Official React bindings for Redux 项目地址: https://gitcode.com/gh_mirrors/re/react-redux React-Redux作为React官方推荐的Redux绑定库,是现代前端开发…...
车载OTA升级失败率下降76%的秘密:Docker 27容器体积压缩至<50MB的12个硬核技巧,Tier1供应商内部培训首度流出
更多请点击: https://intelliparadigm.com 第一章:Docker 27车载容器轻量化的核心价值与行业背景 随着智能网联汽车加速普及,车载计算平台对软件部署的实时性、安全性与资源效率提出严苛要求。Docker 27(2024年正式发布的LTS版本…...
英雄联盟专业录像编辑器:免费开源工具League Director完全指南
英雄联盟专业录像编辑器:免费开源工具League Director完全指南 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirector …...
如何快速掌握Universal x86 Tuning Utility:新手终极性能优化指南
如何快速掌握Universal x86 Tuning Utility:新手终极性能优化指南 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility …...
vue基于springboot的房屋租赁续租系统的设计与实现
目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分续租业务流程系统支撑功能技术实现要点扩展性设计项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用户管理模块 …...
Loki介绍(Grafana Labs轻量级日志聚合系统,不索引日志内容,只索引元数据labels)LogQL查询语言、日志监控、日志系统、ELK、Promtail、Query Frontend
文章目录Loki 入门与架构解析:云原生日志系统的最佳实践一、什么是 Loki?二、Loki 的核心特点1. 低成本存储2. 与 Prometheus 生态无缝集成3. 原生支持云原生4. 高扩展性三、Loki 架构详解1. Distributor(分发器)2. Ingester&…...
从YOLOv2的Anchor Boxes到K-means聚类:我是如何理解‘维度聚类’这个神来之笔的
从YOLOv2的Anchor Boxes到K-means聚类:我是如何理解‘维度聚类’这个神来之笔的 第一次读到YOLOv2论文中关于"维度聚类"的章节时,那种豁然开朗的感觉至今难忘。作为一名算法工程师,我深知目标检测中Anchor Boxes的重要性࿰…...
