当前位置: 首页 > 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);}
}
http://www.lryc.cn/news/418435.html

相关文章:

  • Java面试题(基础篇)②
  • 【docker快捷部署系列二】用docker-compose快速配置多个容器,docker部署Springboot+Vue项目和mysql数据库
  • Java新手指南:从菜鸟到编程大师的趣味之路-类和对象
  • 计算机毕业设计选题推荐-房屋租赁系统-Java/Python项目实战
  • LeetCode 3131.找出与数组相加的整数 I:最小值之差(多语言一行版)
  • Win32注册表操作
  • 白骑士的PyCharm教学高级篇 3.3 Web开发支持
  • SpringAOP-底层实现源码解析
  • 【C语言初阶】C语言操作符全攻略:提升编程效率的关键步骤
  • 2007-2023年上市公司金融化程度测算数据(含原始数据+计算代码+计算结果)
  • 【时时三省】(C语言基础)操作符
  • 常用API(三)
  • 内存管理问题总结
  • 十七、Intellij IDEA2022.1.1下载、安装、激活
  • 【Material-UI】Button Group 中的 Disabled Elevation 功能
  • Java RESTful API 测试:使用 RestAssured
  • 将nestjs项目迁移到阿里云函数
  • 边缘计算×AI:绘制未来实时智能的宏伟蓝图
  • 实现关系运算符的重载
  • 【css】使用CSS绘制奥运五环--巴黎奥运
  • 【Python数据处理】MatplotlibNumpyPandas常用API整理
  • Nacos是阿里巴巴开源的一款分布式服务注册中心和配置中心
  • 条形码与二维码报表
  • 数据采集工具之Flume
  • 【24年最新】AI大模型零基础入门到精通学习资料大全,学完你就是LLM大师!
  • 使用RabbitMQ死信交换机实现延迟消息
  • overleaf上latex表格的使用,latex绘制三线表
  • 聚焦光热型太阳光模拟器助力多晶硅均匀加热
  • 【Android】四大组件(Activity、Service、Broadcast Receiver、Content Provider)、结构目录
  • 前端开发:创建可拖动的固定位置 `<div>` 和自动隐藏悬浮按钮