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

Sprong Boot学习|使用 guava-retrying 实现重试

背景

后端业务系统可能会在接口调用失败、网络拥塞超时、任务执行失败、系统错误等异常情况出现的时候进行重试操作,然而不同的场景对于重试的延迟间隔,频次等会有不同的要求,如果自己编排重试代码会比较繁琐,使用 guava-retrying 可以帮我们灵活实现重试机制。

guava-retrying简介

guava-retrying 是一个线程安全的 Java 重试类库,提供了一种通用方法去处理任意需要重试的代码,可以方便灵活地控制重试次数、重试时机、重试频率、停止时机等,并具有异常处理功能

使用

1、dependency

<dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>2.0.0</version>
</dependency>

2、定义重试器

两个重试器例子

重试器 retryer1: 失败后一直重试,以菲波纳耶数列设置重试等待间隔,直到间隔为1000s,然后以1000s为间隔重不断试

private Retryer<Void> retryer1 = RetryerBuilder.<Void>newBuilder().retryIfExceptionOfType(Throwable.class) // 如果出现Throwable异常则重试.withWaitStrategy(WaitStrategies.fibonacciWait(100, TimeUnit.SECONDS)) // 等待重试策略.withStopStrategy(StopStrategies.neverStop()) // 停止策略.build();

重试器 retryer2:重试3次后抛出异常,每次重试间隔等待300毫秒

    private Retryer<Void> retryer2 = RetryerBuilder.<Void>newBuilder().retryIfExceptionOfType(Throwable.class).withWaitStrategy(WaitStrategies.fixedWait(300, TimeUnit.MILLISECONDS)).withStopStrategy(StopStrategies.stopAfterAttempt(3)).build();

参数定义

  • retryIfExceptionOfType():重试条件,另外还有 retryIfResult,retryIfRuntimeException
  • withWaitStrategy:重试等待策略
  • withStopStrategy:重试停止策略
  • 阻塞策略、超时限制、注册重试监听器(上述简易重试器未涉及到)

3、使用

retryer.call(() -> {log.info("重试方法被调用");if (1 == 1) {throw new RuntimeException("重试错误");}return null;});

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解决idea无法自动编译的最后一个方法(慎用)
  • 响应式编程(Reactive Programming)是什么?
  • 取消selenium多余日志输出DevTools listening on ws://127.0.0.1:52704/devtools/browser/
  • 贪心算法 | 763.划分字母区间
  • Docker-Compose配置zookeeper+KaFka+CMAK简单集群
  • Redisson中RQueue的使用场景附一个异步的例子
  • 基于vue-grid-layout插件(vue版本)实现增删改查/拖拽自动排序等功能(已验证、可正常运行)
  • Ubuntu24.04 deb文件 安装 MySQL8.4
  • GraphRAG + GPT-4o mini 低成本构建 AI 图谱知识库
  • 配置mysql8.0.21版本docker-compose启动容器
  • 星环科技携手东华软件推出一表通报送联合解决方案
  • mac大文件清理软件哪个好 mac大文件怎么清理 苹果电脑清理软件推荐免费
  • 深度学习复盘与论文复现E
  • 接口三层架构
  • 一些和颜色相关网站
  • 《深入 React 技术栈》
  • 11111111
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CentOS7简单部署NFS
  • Java到底能干嘛?
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • laravel5.5 视图共享数据
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • markdown编辑器简评
  • opencv python Meanshift 和 Camshift
  • spring + angular 实现导出excel
  • SQLServer之创建显式事务
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 看域名解析域名安全对SEO的影响
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 树莓派 - 使用须知
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 项目实战-Api的解决方案
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 带你开发类似Pokemon Go的AR游戏
  • 整理一些计算机基础知识!
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #、%和$符号在OGNL表达式中经常出现
  • #define用法
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (vue)页面文件上传获取:action地址
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (学习总结16)C++模版2
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET IoC 容器(三)Autofac
  • .net 连接达梦数据库开发环境部署
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 药厂业务系统 CPU爆高分析
  • .NET分布式缓存Memcached从入门到实战
  • .NET框架
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)