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

基于 Java Supplier与Predicate 封装自动重试机制通用接口

核心逻辑就是把重试的业务与重试中断条件抽象出来函数化,内部重试业务具体化。

关键需要理解Java的函数式接口编程 Supplier 与 Predicate作用。


import lombok.Data;
import lombok.extern.slf4j.Slf4j;import java.util.Random;
import java.util.function.Predicate;
import java.util.function.Supplier;/*** @author zhe.xiao* @version 1.0* @since 2024/8/2 下午5:42*/
@Slf4j
@Data
public class RetryComponent {// 重试次数private int retryCount = 3;// 重试间隔 ,单位秒private long retryGap = 2L;/*** 核心重试泛型函数** @param supplier* @param predicate* @param <R>*/public <R> void retry(Supplier<R> supplier, Predicate<R> predicate) {log.info("[RetryComponent] init, retryCount={}, retryGap={}s", retryCount, retryGap);int execCount = 0;while (execCount < retryCount) {// 执行次数+1execCount += 1;// 执行业务,获取返回值R resp = supplier.get();log.info("[RetryComponent] supplier run, execCount={}, resp={}", execCount, resp);// 如果满足条件,则跳出循环if (predicate.test(resp)) {log.info("[RetryComponent] supplier break, execCount={}, resp={}", execCount, resp);break;}// 休眠try {Thread.sleep(retryGap * 1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("[RetryComponent] sleep error", e);}}log.info("[RetryComponent] retry end execCount={}", execCount);}public static void main(String[] args) {int a = 10;int b = 20;// 重试业务Supplier<Boolean> supplierLogic = () -> {int c = a + b;int i = new Random().nextInt(50);System.out.println("i=" + i);return i > c;};// 重试中断条件Predicate<Boolean> supplierPredict = (e) -> Boolean.TRUE.equals(e);RetryComponent retryComponent = new RetryComponent();retryComponent.retry(supplierLogic, supplierPredict);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 指针函数和函数指针
  • 企业级OV通配符/泛域名https证书申请
  • 大模型检索X一键成片,巴黎奥运的AI新演绎
  • 敏捷与DevOps有什么不同?
  • pyflink的row
  • 渗透小游戏,各个关卡的渗透实例
  • 指针的指针作为形参实测
  • 【组合数学】【Python】【小练习】一、斯特灵近似式求阶乘
  • C++ 基础入门篇
  • 一篇模块化RAG之最新全面系统性综述
  • 【必看!】阿里云推出QWen-7B和QWen-7b-Chat,开放免费商用!
  • MySQL--数据库备份
  • Snooping Coherence Protocols
  • 【langchain学习】使用JsonOutputParser让大模型生成结构化JSON数据
  • PMP报考条件真的需要做项目达到3年时间吗?
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Angular6错误 Service: No provider for Renderer2
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Debian下无root权限使用Python访问Oracle
  • es6要点
  • Github访问慢解决办法
  • JSDuck 与 AngularJS 融合技巧
  • JS笔记四:作用域、变量(函数)提升
  • 代理模式
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 记一次用 NodeJs 实现模拟登录的思路
  • 深度学习在携程攻略社区的应用
  • 手写双向链表LinkedList的几个常用功能
  • 用 Swift 编写面向协议的视图
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (AngularJS)Angular 控制器之间通信初探
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)php投票系统 毕业设计 121500
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)Scala的“=”符号简介
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 2.1路线图
  • .net操作Excel出错解决
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @SuppressWarnings注解
  • @vue-office/excel 解决移动端预览excel文件触发软键盘
  • [AIGC] CompletableFuture的重要方法有哪些?
  • [Android]Tool-Systrace