异常重试工具

目录

      • RetryUtils方法
      • main方法测试
      • 拓展-函数接口

RetryUtils方法

该Java函数retryOnException用于在指定重试次数内执行某个操作,并在遇到异常时重试。功能如下:

  • 对传入的操作(retryCallable)进行尝试执行。
  • 如果执行成功且结果符合预期(matching方法返回true),则停止重试并返回结果。
  • 否则,在达到最大重试次数前,等待一段时间后再次尝试,并记录日志信息。
  • 最终返回最后一次的结果,无论是否成功。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/***  * <p>异常重试工具  </p>** @author Javen*/
public class RetryUtils {private static final Logger log = LoggerFactory.getLogger(RetryUtils.class);/*** 回调结果检查*/public interface ResultCheck {/*** 是否匹配** @return 匹配结果*/boolean matching();/*** 获取 JSON** @return json*/String getJson();}/*** 在遇到异常时尝试重试** @param retryLimit    重试次数* @param retryCallable 重试回调* @param <V>           泛型* @return V 结果*/public static <V extends ResultCheck> V retryOnException(int retryLimit,java.util.concurrent.Callable<V> retryCallable) {V v = null;for (int i = 0; i < retryLimit; i++) {try {v = retryCallable.call();} catch (Exception e) {log.warn("retry on " + (i + 1) + " times v = " + (v == null ? null : v.getJson()), e);}if (null != v && v.matching()) break;log.error("retry on " + (i + 1) + " times but not matching v = " + (v == null ? null : v.getJson()));}return v;}/*** 在遇到异常时尝试重试** @param retryLimit    重试次数* @param sleepMillis   每次重试之后休眠的时间* @param retryCallable 重试回调* @param <V>           泛型* @return V 结果* @throws java.lang.InterruptedException 线程异常*/public static <V extends ResultCheck> V retryOnException(int retryLimit, long sleepMillis,java.util.concurrent.Callable<V> retryCallable) throws java.lang.InterruptedException {V v = null;for (int i = 0; i < retryLimit; i++) {try {v = retryCallable.call();} catch (Exception e) {log.warn("retry on " + (i + 1) + " times v = " + (v == null ? null : v.getJson()), e);}if (null != v && v.matching()) {break;}log.error("retry on " + (i + 1) + " times but not matching v = " + (v == null ? null : v.getJson()));if (sleepMillis > 0) {Thread.sleep(sleepMillis);}}return v;}
}

main方法测试

    public static void main(String[] args) {RetryUtils.ResultCheck resultCheck = RetryUtils.retryOnException(100, () -> new RetryUtils.ResultCheck() {int randomInt = RandomUtil.randomInt(1, 100);@Overridepublic boolean matching() {System.out.println("randomInt:" + randomInt);return randomInt < 5;}@Overridepublic String getJson() {return String.valueOf(randomInt);}});String json = resultCheck.getJson();System.out.println(json);}

在这里插入图片描述

拓展-函数接口

  • 方法
    public static <V> V retryOnException(java.util.concurrent.Callable<V> retryCallable) {V v;try {v = retryCallable.call();} catch (Exception e) {throw new RuntimeException(e);}return v;}
  • 调用
Integer integer = retryOnException(() -> {return  RandomUtil.randomInt(1, 100) < 50 ? 2: 1;});System.out.println(integer);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/420556.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码管理工具——git及阿里云云效的使用(包含git的使用及云效自动化部署)

1、做项目开发时都会用到代码管理工具,像是我之前使用过gitHub,Visual Studio等一些代码管理工具&#xff0c;这里介绍的是阿里云云效的使用。 2、首先登录阿里云云效&#xff0c;登录进去之后会看到公司给你开放的一个仓库。 3、进入仓库&#xff0c;点击克隆/下载&#xff0…

docker部署rabbitMQ 单机版

获取rabbit镜像&#xff1a;我们选择带有“mangement”的版本&#xff08;包含web管理页面&#xff09;&#xff1b; docker pull rabbitmq:management 创建并运行容器&#xff1a; docker run -d --name rabbitmq -p 5677:5672 -p 15677:15672 rabbitmq:management --name:…

[数据集][目标检测]汽油检泄漏检测数据集VOC+YOLO格式237张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;237 标注数量(xml文件个数)&#xff1a;237 标注数量(txt文件个数)&#xff1a;237 标注类别…

TMGM:黄金价格保持在2,500美元左右稳定

美国国库券收益率修剪了早期的涨幅&#xff0c;对美元构成压力。市场参与者正在期待美国消费者价格指数在星期三发布。XAU/USD努力扩大2,500美元以上的涨幅&#xff0c;原因是多头暂停了。 现货黄金交易就在2,500美元的标记附近&#xff0c;星期一没什么变动&#xff0c;并局限…

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (三) 代码编译、各种问题解决、代码修改

目录 1 infer_server编译 1.1 infer_server/CMakeLists.txt修改 1.2 FindLibCompute.cmake编写 1.2 findLibCVCuda.cmake编写 1.3 ./3rdparty/config_lib_aarch64.sh修改 1.4 解决各种编译错误 1.4.1 /usr/include/c/11/bits/algorithmfwd.h:259:5: error: ‘pair’ doe…

OpenCV-轮廓检测

文章目录 一、简介1. 意义2.具体步骤 二、代码实现三、总结 一、简介 1. 意义 在OpenCV中&#xff0c;轮廓检测是图像处理中一个非常重要的环节&#xff0c;它允许我们识别图像中的形状。这个过程通常涉及几个步骤&#xff1a;读取图像、转换为灰度图、应用阈值处理&#xff…

Django发送邮件

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 Django 5框架Web应用开发_夏天又到了的博客-CSDN博客 本文学习怎么使用Django发送邮件。 尽管使用Python的smtplib模块发送电子邮件…

Go语言概述

1.Go语言的特点 1&#xff09;从语言层面支持并发&#xff0c;实现简单 2&#xff09;goroutine&#xff0c;轻量级线程&#xff0c;可实现大并发处理&#xff0c;高效利用多核 3&#xff09;垃圾回收机制&#xff0c;内存自动回收&#xff0c;不需要开发人员管理 4&#xff0…

2024年10款好用的图纸加密软件推荐|企业图纸的守护神

在数字化时代&#xff0c;图纸数据的安全性是企业不可忽视的重要任务。随着技术的不断进步&#xff0c;图纸加密软件成为了保护企业知识产权和敏感数据的关键工具。以下是2024年推荐的10款好用的图纸加密软件&#xff0c;它们各具特色&#xff0c;能够满足不同企业的需求。 1.…

SpringBoot大学生租房平台:技术实现与市场分析

第2章 开发环境与技术 大学生租房平台的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对大学生租房平台用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&#xff0c;没有办…

【南京工业大学主办,JPCS出版】自动化、电气控制系统与设备

&#x1f308;2024年自动化、电气控制系统与设备国际学术会议&#xff08;AECSE 2024&#xff09;是致力于将“自动化与电气”领域的专家学者、研发者和技术人员汇集一堂的国际盛会。会议将于2024年10月18-20日在中国南京举行。 &#x1f308;会议的主旨是为相关领域的从业者及…

log4j日志封装说明—slf4j对于log4j的日志封装-正确获取调用堆栈

日志是项目中必用的东西&#xff0c;日志产品里最普及应该就是log4j了。(logback这里暂不讨论。) 先看一下常用的log4j的用法&#xff0c;一般来说log4j都会配合slf4j或者common-logging使用&#xff0c;这里已slf4j为例。添加gradle依赖&#xff1a; dependencies { compile(l…

zookeeper是啥?在kafka中有什么作用

一、Zookeeper是啥 问AI&#xff0c;它是这么说&#xff1a; ZooKeeper是一个开源的分布式协调服务。 ZooKeeper最初由雅虎研究院开发&#xff0c;用于解决大型分布式系统中的协调问题&#xff0c;特别是为了避免分布式单点故障。它被设计成一个简单易用的接口集&#xff0c;封…

Untiy TTF转换为SDF

Untiy TTF转换为SDF 原因 下载的字体是TTF格式&#xff0c;但是TMP使用的是SDF格式&#xff0c;不支持TTF&#xff0c;需要转换网络没有检索到TTF转SDF的教程&#xff0c;可能是太简单了&#xff0c;自己记录一下吧 Unity内转换即可 在Asset中找到自己的TTF右键点击TTF&…

团队氛围评估模型:忍耐度模型(心理调适度行为调适度)

通过“忍耐度模型”对团队氛围进行评估&#xff0c;可以清晰地反映出不同员工的心理状态和行为模式&#xff0c;进而可以采取有针对性的管理措施来优化团队氛围和提升团队绩效。 X轴&#xff1a;心理调适度&#xff0c;随坐标轴方向表示从低到高&#xff1b;Y轴&#xff1a;行…

汽车驾驶屏HMI,设计颜值相当拉风, 怪不的大家都喜欢呀。

hell&#xff0c;大家好&#xff0c;本期为大家带来汽车驾驶仪表盘的设计&#xff0c;尽管平时碰到设计汽车HMI的场景比较少&#xff0c;但是看到如此精彩和充满创意的设计&#xff0c;对于设计师水平提升也是十分有帮助的。

SpringBoot 集成 PDFBox 实现电子签章

Apache PDFBox 是一个开源的 Java 库&#xff0c;用于处理 PDF 文档。它提供了一系列强大的功能&#xff0c;包括创建、渲染、拆分、合并、加密、解密 PDF 文件&#xff0c;以及从 PDF 中提取文本和元数据等。PDFBox 支持 PDF 1.7 标准&#xff0c;并且兼容大多数现代 PDF 格式…

CMDB是什么软件?对企业有什么用?

配置管理数据库缩写为CMDB&#xff0c;英文全称为Configuration Management Database&#xff0c;是一种用于记录和管理企业信息技术基础设施&#xff08;IT基础设施&#xff09;和所有相关资源的数据库软件。 CMDB的主要功能是收集、存储和分析所有IT基础设施和服务的信息&am…

【C语言】选择排序及优化、冒泡排序、计数排序的实现

目录 一、选择排序1.1 常规版&#xff08;一次排好一个数&#xff09;1.1.1 基本思想1.1.2 实现思路1.1.3 代码 1.2 优化版&#xff08;一次排好两个数&#xff09;1.2.1 实现思路1.2.2 代码 1.3 时间复杂度 二、冒泡排序2.1 实现思路2.2 代码2.3 时间复杂度 三、计数排序3.1 基…

56页PPT | 大数据决策分析平台怎么建设?经典实践方案推荐

一、现状和目标 企业用户现状&#xff1a;数据分散&#xff0c;利用率低&#xff0c;业务需求变化快但IT响应慢。 问题&#xff1a;数据展示不及时、不准确&#xff0c;缺乏深入分析工具&#xff0c;报表制作效率低下。 目标&#xff1a;建设统一的数据整合平台&#xff0c;…