什么是重试重试是指 , 当在一个程序运行过程中 , 突然遇到了例如网络延迟 , 中断等情况时 , 为了保证程序容错性 , 可用性 , 一致性等的一个措施 , 目前主流的框架大多都有一套自己的重试机制 , 例如 dubbo , mq , Spring 等
概要Spring 也自己实现了一套重试机制 , Spring Retry 是从 Spring batch 中独立出来的一个功能 , 主要功能点在于重试和熔断 , 目前已经广泛应用于 Spring Batch,Spring Integration, Spring for Apache Hadoop 等 Spring 项目 。spring retry 提供了注解和编程 两种支持 , 提供了 RetryTemplate 支持 , 类似 RestTemplate 。整个流程如下:
文章插图
使用介绍Maven 依赖
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><!-- also need to add Spring AOP into our project--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></dependency>
注解使用开启 Retry 功能 , 需在启动类中使用 @EnableRetry 注解@SpringBootApplication@EnableRetry@EnableSchedulingpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
注解 @Retryable需要在重试的代码中加入重试注解 @Retryable @Retryable(value = https://www.isolves.com/it/cxkf/kj/2023-05-18/RuntimeException.class)public void testRetry01() throws MyException {System.out.println("测试-value属性");throw new RuntimeException("出现了异常");}
默认情况下 , 会重试 3 次 , 间隔 1 秒重试配置通过 @Retryable 注解的属性 可以实现重试配置
- Value()
- includevalue 与 include 含义相同 , 表示可重试的异常类型 。默认为空 , 如果同时 exclude 也为空则会重试所有异常 。但在使用时需要注意
@Retryable(value = https://www.isolves.com/it/cxkf/kj/2023-05-18/RuntimeException.class)public void testRetry01() throws MyException {System.out.println("测试-value属性");throw new RuntimeException("出现了异常");}
例:testRetry01 只会在程序抛出 RuntimeException 时 , 开启重试- exclude不可重试的异常类型 。默认为空(如果 include 也为为空 , 将重试所有异常) 。如果 include 为空但 exclude 不为空 , 则重试非 exclude 中的异常 @Retryable(exclude = RuntimeException.class)
public void testRetry02() throws MyException {
System.out.println("测试-value属性");
throw new MyException("出现了异常");
}例:testRetry02 在程序抛出 MyException 时 , 不会开启重试 - maxAttempts
- maxAttemptsExpression
@Retryable(value = https://www.isolves.com/it/cxkf/kj/2023-05-18/MyException.class, maxAttemptsExpression = "${maxAttempts}")public void testRetry03() throws MyException {System.out.println("测试-maxAttemptsExpression属性");throw new MyException("出现了异常");}
文章插图
例:testRetry03 会去读 properties 配置文件获取属性名为 maxAttempts 的值
@Retryable(value = https://www.isolves.com/it/cxkf/kj/2023-05-18/MyException.class,maxAttemptsExpression = "#{2+3}")public void testRetry04() throws MyException {System.out.println("测试-maxAttemptsExpression属性");throw new MyException("出现了异常");}
例:testRetry04 会去通过 SqlEL 计算出对应的重试值- exceptionExpression
@Retryable(value = https://www.isolves.com/it/cxkf/kj/2023-05-18/MyException.class, exceptionExpression = "#{@retryService.isRetry()}")public void testRetry05() throws MyException {System.out.println("测试-exceptionExpression");throw new MyException("出现了异常");}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 何静|何静公开力挺汪小菲!怒斥大S太欺负人,称其算什么东西必遭报应
- 为什么交警查车会摸一下车尾?听交警一说,网友:太机智了
- 发动机故障灯亮一会就灭了,这是什么情况?
- 杨乐乐|杨乐乐毁灭史:从“湖南一姐”到“万人唾”,她都做了什么事?
- 大头菜有什么功效作用 大头菜可以生吃吗
- 带子什么人不能吃 带子可以生吃吗
- 七境堂绿茶是什么茶 七境堂绿茶价格及批发价查询
- 翡翠|很多人知道翡翠不戴要水养,但用什么水?
- 大闸蟹的选购技巧 大闸蟹988型是什么意思
- |为什么很多员工会谎报离职原因?