Spring 重试机制实现原理

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Spring 重试机制实现原理

Spring 重试机制实现原理

重试,我们都不陌生,是为了保障逻辑容错性和可用性的一种机制。一般在网络通信组件底层比较常见,比如网络连接操作,如果有网络中断时,一般需要重试几次。

在上层的业务代码里,如果我们需要对某个特定操作加入重试机制,可以硬编码,然后循环调用,累计调用次数,然后设定退出条件。

当有比较多的重试代码浑在正常的业务代码时,会看起来比较混乱,从功能的角度来看,重试的部分可以独立出来,保证常规业务代码的简洁。这正是Spring retry的做法。

今天介绍下Spring Retry,一种简单无侵入的重试组件。

Spring Retry原来是属于Spring Batch中的一个功能模块,后来独立拆分出来,成一个单独的功能模块。

开启retry

在业务代码中声明需要retry的方法

Spring 重试机制实现原理

用起来很简单,就一个注解。对业务逻辑无侵入。

@Retryable 加在方法上,表示该方法要执行重试的具体逻辑代码,注解里声明的value 中的SqlException表示触发重试的条件,也可以认为是重试策略,maxAttempts是重试次数;backoff中的delay为重试间隔时间,单位为ms;默认的设置为重试3次,间隔1s。

@Recover作为重试最终失败的兜底策略,在重试方法最终抛出某特定异常时被执行。

Spring 重试机制实现原理

第一个参数SqlException是作为触发兜底策略的条件,后面的参数是上边重试方法的参数,如有多个的话,顺序须一致,方法返回值也要一致。

关于@Retryable和@Recover的实现方式,无疑是通过Spring aop来实现,相信了解Spring aop的同学都大概明白,spring处理注解的一贯作法:代理加advice.

搜索@Retryable的usage,可以看到一个MethodInceptor的实现类 AnnotationAwareRetryOperationsInterceptor,这个类用方法拦截器的形式封装了重试的逻辑。

而 RetryConfiguration负责把切面逻辑绑定到目标pointcut。

此外,除了上面声明式的使用方式,也可以使用采用编程式的方式直接控制重试过程。

Spring 重试机制实现原理

RetryTemplate作为重试的核心类,组织了重试策略RetryPolicy、延后策略BackoffPolicy、RetryListener等重试逻辑中的功能

Spring 重试机制实现原理

RetryTemplate是RetryPerations的接口实现,主要体现在以下几个行为:

Spring 重试机制实现原理

没错,这几个方法都代表了对目标方法(我们需要重试的方法)的执行,其中参数RetryCallback接口封装了我们的目标方法。

RetryPolicy,决定了如何触发重试

Spring 重试机制实现原理

上边列出的是已经就绪的几种具体实现,功能可以从名称一目了然,不再一一阐述

BackOffPolicy决定了重试间隔的具体实现方式,有如下实现

Spring 重试机制实现原理

有固定时间的,指数级增加的还有线程sleep等,不再深究各种实现的细节。

Spring Retry使用简单,但功能强大,除了上述基本功能外,甚至可以做熔断机制,列位看官如有兴趣可去翻看CircuitBreakerRetryPolicy源码。

更详细的使用教程不再作说明,大家可以上网搜索。

附上Spring retry的github 地址 

https://github.com/spring-projects/spring-retry

Spring 重试机制实现原理

SpringAutowired

一个有用的公众号

Spring 重试机制实现原理Spring 重试机制实现原理

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Spring 重试机制实现原理


 上一篇
SpringMVC配置文件 SpringMVC配置文件
SpringMVC配置文件Web.xml核心拦截器以及配置文件的路径 !-- spring 核心转发器,拦截指定目录下的请求,分配到配置的拦截路径下处理 -- servlet servlet-namedispatcher/servle
2021-04-05
下一篇 
Spring Environment Abstraction Spring Environment Abstraction
在spring中,properties和profile是Environment abstraction 的两个核心, 作为一个整体模块整合到了Spring container中,Environment abstraction是App
2021-04-05