@Retryable和Guava retry

news/2024/4/14 7:12:20

文章目录

  • 一、spring的@Retryable
      • 1.1 作用:
      • 1.2链接:https://www.cnblogs.com/EasonJim/p/7684649.html
      • 1.3 坑
      • 1.4 @Recover
        • 补充
        • 依赖
  • 二、Guava-retry:使用

一、spring的@Retryable

1.1 作用:

@Retryable注解,被注解的方法发生异常时会重试

1.2链接:https://www.cnblogs.com/EasonJim/p/7684649.html

@启动类

@EnableRetry
public class ApplicationLoader {}

1.3 坑

https://blog.csdn.net/qq_20989105/article/details/80003087

https://blog.csdn.net/wtopps/article/details/103698635

1、不能内部调用

2、delay = 100(ms)单位是ms,太小的话,比如5ms,相当于失败的瞬间再次调用了,很可能再次失败

3、value = 可重试的异常类型。 include() 的同义词。 默认为空(如果 excludes 也是空的,则重试所有异常)。

1.4 @Recover

1、使用

@Resource
private ProcesstService processtService;@Retryable(recover = "recoverSubmit")public String submit(BillSubmitRequest req) {try {BillSubmitResponse resp = processtService.submit(req);int code = resp.getErrorCode();if (code != 0) {throw new GatewayException(ExceptionCodeConstant.GATEWAY_EXCEPTION_CODE,"创建流程失败,resp:" + GsonUtils.toJsonStr(resp));}return resp.getBillNo();} catch (TException e) {throw new GatewayException(ExceptionCodeConstant.GATEWAY_EXCEPTION_CODE, "创建流程发生异常", e);}}@Recoverpublic String recoverSubmit(Exception e, BillSubmitRequest req) throws Exception {log.error("创建流程异常,req:[{}]", GsonUtils.toJsonStr(req), e);throw e;}
补充
  • 默认重试3次

  • 任何异常,都等触发重试

  • recover:当重试3次后,会走到对应的recover指定方法中。

    如果方法recoverSubmit方法中不throw e,就相当于,吃掉了异常。

    • 如果上层,强依赖此submit方法数据,则必须throw e,中断流程
    • 如果上层,不强依赖此submit方法数据,则无需throw e。是否throw判断逻辑和原本方法不使用recover一致
依赖
  • pom
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.4</version>
</dependency>// 由于该组件是依赖于 AOP 给你的,所以还需要引入这个依赖(如果你其他 jar 包中引用过了,当然也就不需要再次引用了)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.6.1</version>
</dependency>
  • 启动类
@EnableRetry
public class ApplicationStarter {public static void main(String[] args) {SpringApplication.run(ApplicationStarter.class);}
}
  • 注意事项
    @Recoverpublic String recoverSubmit(Exception e, BillSubmitRequest req) throws Exception {log.error("创建流程异常,req:[{}]", GsonUtils.toJsonStr(req), e);throw e;}
  • 补偿方法的参数不是当前异常或者异常的父类,抛出ExhaustedRetryException 异常。所以建议是Exception
  • @Recover方法需要和@Retryable方法在同一个类中才能生效@Recover方法(@Recover方法在父类中也可以生效)

二、Guava-retry:使用

https://zzzgd.blog.csdn.net/article/details/84377962?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=2

场景:生成单据号,通过redis原子自增生成时,需要Guava-retry保证redis的Client执行成功

作用:防止redis超时等


http://www.ppmy.cn/news/1122316.html

相关文章

使用selenium驱动浏览器

使用Selenium驱动浏览器的步骤如下&#xff1a; 安装Selenium库&#xff1a;在Python环境中&#xff0c;使用pip命令安装Selenium库。可以在命令行中运行以下命令来安装&#xff1a; pip install selenium 下载浏览器驱动程序&#xff1a;根据你要使用的浏览器类型&#xff0c;…

Nginx 解决内容安全策略CSP(Content-Security-Policy)配置方式

1、修改 nginx 配置文件 在nginx.conf 配置文件中&#xff0c;增加如下配置内容&#xff1a; add_header Content-Security-Policy "default-src self localhost:8080 unsafe-inline unsafe-eval blob: data: ;";修改后效果如下&#xff1a; 2、重启 nginx 服务 …

LCP 51.烹饪料理

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 暴力遍历所有可能然后返回最大美味度或 -1 即可。 解题代码&#xff1a; class Solution {public int perfectMenu(int[] m…

CSS 基础 4

(●◡●)target ⇛ 圆角边框 ⇛ 盒子阴影 ⇛ 文字阴影 圆角边框 在CSS3中新增了圆角边框的样式, 这样我们的盒子就可以变成圆角了. 圆角在我们生活中很常见, 例如: ① 我们浏览器的标签 显示就会是一个圆角边框 ② 浏览器的搜索栏 如何设置圆角边框?? 设置属性 border-…

git总结

git总结 git clone git branch -vv 查看本地对应远程的分支对应关系 git branch -a 查看本地和远程的所有分支 git checkout -b xxx 以当前本地分支作为基础新建一个xxx分支 git branch --set-upstream-toorigin/xxx 将本地分支与远程分支xxx分支进行关联形成关联关系 gi…

罗德里格斯公式

1.点乘 A ⃗ ⋅ B ⃗ ∣ A ⃗ ∣ ∣ B ⃗ ∣ c o s ⟨ A ⃗ , B ⃗ ⟩ \vec{A} \cdot \vec{B} \left | \vec{A} \right | \left | \vec{B} \right | cos\left \langle \vec{A}, \vec{B} \right \rangle A ⋅B ​A ​ ​B ​cos⟨A ,B ⟩ 对应几何意义&#xff1a;向量 A ⃗…

P-GaN栅极HEMT开关瞬态分析中的动态栅极电容模型

标题&#xff1a;Dynamic Gate Capacitance Model for Switching Transient Analysis in P-GaN Gate HEMTs 摘要 在这项工作中&#xff0c;提出了一种用于P-GaN栅极HEMT的高效开关瞬态分析模型&#xff0c;该模型考虑了开关瞬态过程中的动态栅极电容CG(VDS, VGS)特性。同时&a…

【WordPress】分页插件WP-PageNavi使用教程

参考&#xff1a;WordPress分页插件&#xff1a;WP-PageNavi_51CTO博客_wordpress静态化插件 注意&#xff1a;此插件并不是启用后就可以看到效果了&#xff0c;必须把以下代码放到模板上&#xff1b; 例如&#xff1a;分类目录模板【如果放置在底部&#xff0c;请添加到foote…

雷达编程实战之静态杂波滤除与到达角估计

雷达中经过混频的中频信号常常混有直流分量等一系列硬件设计引入的固定频率杂波&#xff0c;我们称之位静态杂波&#xff0c;雷达信号处理需要把这些静态杂波滤除从而有效的提高信噪比&#xff0c;实现准确的目标检测功能。 目标的到达角估计作为常规车载雷达信号处理的末端&am…

【06】FISCOBCOS中的节点前置服务

WeBASE管理平台 微众银行开源的自研区块链中间件平台——WeBASE(WeBank Blockchain Application Software Extension) 是区块链应用和FISCO BCOS节点之间搭建的中间件平台。WeBASE屏蔽了区块链底层的复杂度,降低区块链使用的门槛,大幅提高区块链应用的开发效率,包含节点前置…

Netty简介及简单客户端/服务端示例代码

什么是Netty&#xff1f; Netty是一个NIO客户机-服务器框架&#xff0c;它支持快速而容易地开发网络应用程序&#xff0c;如协议服务器和客户机。它大大简化和简化了网络编程&#xff0c;如TCP和UDP套接字服务器。 “快速简单”并不意味着生成的应用程序将遭受可维护性或性能问…

Java JVM(1) - 走进JVM

走进JVM JVM相对于Java应用层的学习难度更大&#xff0c;开篇推荐掌握的预备知识&#xff1a; C/C(关键)、微机原理与接口技术、计算机组成原理、操作系统、数据结构与算法、编译原理&#xff08;不推荐刚学完JavaSE的同学学习&#xff09;&#xff0c;如果没有掌握推荐的一半…

PHP免登录积分商城系统/动力商城/积分商城兑换系统源码Tinkphp

介绍&#xff1a; PHP免登录积分商城系统/动力商城/积分商城兑换系统源码Tinkphp&#xff0c;这个免登录积分商城系统是一种新型的电子商务模式&#xff0c;它通过省去麻烦的注册步骤&#xff0c;让用户能够很快又方便去积分兑换。这种商城系统具有UI干净整洁大方、运行顺畅的…

双向链表的查找、插入和删除

双向链表的查找 #include <stdio.h> #include <stdlib.h>typedef int data_t;typedef struct node{data_t data;struct node *prior;struct node *next; }dlistnode;dlistnode* dlist_create(){dlistnode *H,*r,*p;int n;if((H(dlistnode *)malloc(sizeof(dlistno…

【算法训练-二叉树 六】【路径和计算】路径总和I、路径总和II、路径总和III、二叉树的最大路径和

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【二叉树的节点查找】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条…

STL-常用容器

string容器 string构造函数 string本质&#xff1a;类 string和char*区别&#xff1a; char* 是一个指针 string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器。 特点&#xff1a; string类内部封装了很多成员方法 …

【数据结构】二叉搜索树与Map和Set

目录 ♫二叉搜索树 ♪什么是二叉搜索树 ♪二叉搜索树的特性 ♪模拟实现二叉搜索树 ♫Map ♪什么是Map ♪Map的内部类 ♪Map的常用方法 ♪Map的遍历 ♫Set ♪什么是Set ♪Set的常用方法 ♪Set的遍历 ♫二叉搜索树 ♪什么是二叉搜索树 二叉搜索树又称二叉排序树&#…

react轮播图如何实现

在React中实现轮播图&#xff0c;可以使用一些已有的库&#xff0c;例如react-slick或者react-responsive-carousel&#xff0c;也可以手动编写。下面是一个简单的使用react-slick库的例子&#xff1a; 首先&#xff0c;需要安装 react-slick&#xff1a; npm install react-…

C++——如何正确的使用STL中的vector?

什么是vector&#xff1f; 在STL&#xff08;标准模板库&#xff09;中&#xff0c;vector是一种动态数组容器&#xff0c;可根据需要自动增长或缩小。它可以存储任意类型的元素&#xff0c;并且支持快速的随机访问。 vector是表示可变大小数组的序列容器vector采用的是连续的…
最新文章