SpringRetry核心执行模型
SpringRetry的核心执行模型是利用SpringAOP来实现的,通过定义注解以及注解内定义的属性创建相关的上下文、拦截器,然后执行被注解的方法,由各自Advice实现方法的增强,实现重试及兜底等操作。
下面我们通过核心执行流程串解主要的执行模型对象。
一、 EnableRetry注解
用于开启重试机制,源码如下:
image.png
这里的@EnableAspectJAutoProxy(proxyTargetClass = false)就是打开Spring AOP功能。
注意重点看看@Import(RetryConfiguration.class) @Import相当于注册这个Bean
二、 RetryConfiguration注解
image.png
它是一个AbstractPointcutAdvisor,它有一个pointcut和一个advice;
我们知道,在IOC过程中会根据PointcutAdvisor类来对Bean进行Pointcut的过滤,然后生成对应的AOP代理类,用advice来加强处理。
看看RetryConfiguration的初始化:
image.png
1、buildPointcut代码用到了AnnotationClassOrMethodPointcut,其实它最终还是用到了AnnotationMethodMatcher来根据注解进行切入点的过滤,这里就是@Retryable注解了。
2、 buildAdvice代码使用一个核心的拦截器AnnotationAwareRetryOperationsInterceptor,会进行切面的增强定义及操作;
三、 Retryable注解
image.png
这个注解比较简单,没什么特别地方,注意其持有的属性及默认值,比如stateful默认false,会影响后面拦截器的创建,Interceptor属性定义自定义的拦截器;
四、 AnnotationAwareRetryOperationsInterceptor拦截器
这是个核心的拦截器,类继承关系:
image.png
可以看出AnnotationAwareRetryOperationsInterceptor是一个MethodInterceptor,在创建AOP代理过程中如果目标方法符合pointcut的规则,
它就会加到interceptor列表中,然后做增强,我们看看invoke方法做了什么增强。
image.png
这里使用了代理,来根据@Retryable注解属性的定义进行被代理的拦截器创建,主要是有状态和无状态的Interceptor,或者是你自定义的MethodInterceptor,而且优先级最高,然后执行被创建的拦截器行为。
getDelegate方法的主要逻辑:
image.png image.png
这里的RetryInterceptorBuilder又是一个核心的模型对象。
五、RetryInterceptorBuilder重试拦截器创建者
这个是核心的拦截器创建者,引用关系:
image.png
其内部定义了无状态、有状态、熔断三个拦截器,并Override父类的build方法作为自身的创建;
由各个子类实现具体的Build组装过程,并作为单例存在,降低对象创建销毁开销;
image.png
至此,真正要执行的拦截器已经被获取到,那么接下来就会执行其invoke方法实现切面的增强,我继续看具体是如何做到的。
五、RetryOperationsInterceptor无状态重试拦截器
这个应该叫StatelessRetryOperationsInterceptor,估计是用的最多的一个,就作为默认省去了stateless,类继承关系:
image.png
我们来看invoke方法,核心逻辑如下:
image.png
调用的是RetryTemplate的execute方法;
六、RetryTemplate重试模板类
这个是重试框架的核心逻辑对象,构建了重试的基础骨架,最终实现了重试的操作,代码较长,需走读源码,其描述是这样说的:
这个方法中定义的相当“丰富”,涵盖了重试整个框架的所有业务对象及其操作方法,值得好好品鉴!
七、主要的业务模型
RetryContextCache 重试上下文对象
BackOffPolicy 延迟策略对象
RetryPolicy 重试策略对象
RetryListener 重试监听对象
RetryOperations 重试操作对象