美文网首页SpringRetry源码解读
SpringRetry核心执行模型

SpringRetry核心执行模型

作者: 梦想又照进现实 | 来源:发表于2019-11-08 11:22 被阅读0次

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重试模板类
这个是重试框架的核心逻辑对象,构建了重试的基础骨架,最终实现了重试的操作,代码较长,需走读源码,其描述是这样说的:

image.png

这个方法中定义的相当“丰富”,涵盖了重试整个框架的所有业务对象及其操作方法,值得好好品鉴!

七、主要的业务模型
RetryContextCache 重试上下文对象
BackOffPolicy 延迟策略对象
RetryPolicy 重试策略对象
RetryListener 重试监听对象
RetryOperations 重试操作对象

相关文章

  • SpringRetry核心执行模型

    SpringRetry的核心执行模型是利用SpringAOP来实现的,通过定义注解以及注解内定义的属性创建相关的上...

  • CUDAC权威编程---第三章

    CUDA执行模型概述 这一篇开始开始接近CUDA最核心的部分,就是有关硬件,和程序的执行模型,用CUDA的目的其实...

  • SpringRetry策略设计

    SpringRetry策略设计 一、 BackOff策略整体的关系图: ExponentialBackOffPo...

  • 执行模型

    执行模型指定在给定一系列字节码指令和一小组环境数据的情况下如何更改系统状态。这是通过一个称为以太坊虚拟机(EVM)...

  • SpringRetry包结构

  • SpringRetry设计模式

    一、 Singleton单例模式RetryInterceptorBuilder重试拦截器创建者它为单例,同时为抽...

  • javaScript 三个组成部分

    核心(ECMAScript)文档对象模型(DOM)浏览器对象模型(BOM) 1. 核心(ECMAScript) 语...

  • 工作清单

    专注清单 核心1任务 时间进度表 限时完成 奖励 执行清单 避免干扰 环境舒适 运用思维模型 坚持与心理暗示 保存...

  • JavaScript基本知识(一)

    1.javascript的组成: DOM:文档对象模型。核心对象:document BOM:浏览器对象模型。核心对...

  • tensorflow template

    机器学习的三个核心的定义:定义模型、定义目标函数和定义优化方法 构建计算图 分发计算任务 执行计算任务另外还要准备...

网友评论

    本文标题:SpringRetry核心执行模型

    本文链接:https://www.haomeiwen.com/subject/cgyibctx.html