我之前读过一篇文章,该文章使用@ASYNC注释提到了两个问题。第一个是线程池的阻塞队列,以在春季实现@ASYNC注释是无界的lecteue linkedblockingqueue。这导致最大线程数量的配置无效,有许多异步任务和长时间的执行时间,任务将始终堆积在队列中,并且任务延迟了。第二个问题是在Springboot,如果存在,则不是自定义线程池实例,SpringBoot将使用默认线程池。此默认线程池是简单的nctaskexecutor。此线程池将为每个任务创建一个线程。它将引起资源问题。
因为为了了解@Async的原理,我决定在Springboot中@ASYNC注释的源代码启动@ASYNC注释,因此为了了解@Async的原理。
首先查看@enableasync注释
@Import注释引入了AsyncconFigurationElector类,从AdviceModeImportSelector继承
在阅读了AsyncconFigurationSelector类的结构后,然后查看此类的哪种方法,然后查看调用哪种方法。
EssenceConfigurationClassparser的ProcessImports方法循环所有导入的值。对于每个呼叫图578实例化选择器的行代码,在实例化每个选择器之后,它将继续调用每个选择器的SelectImports(AdviceMode)方法以获取每个选择。配置类。在这种方式中,实现了@Import注释函数,并根据配置引入相应的配置类。
关于@Import可以参考本文@Import注释
proxyasyncconfiguration此类主要功能是声明异步的bean of ancancannotionbeanpostProcessor,它是异步注释后处理器。首先
可序列化的序列化接口,与代理代理相关的统一配置类,顺序优先接口,AopinfrasticBean是当前类的识别,不允许代理。
Aware接口是一个应用弹簧框架的某些功能的接口。例如,BeanFactoryAware接口可以获得弹簧的beanfactory,当实例化接口的类时,弹簧框架将将beanfactory传递给重写setBeanFactory(beanfactory)(beanfactory)BeanFactory)方法。BeanClassLoadraaware界面可以使Spring的BeanClassloader。
BeanPostProcessor接口是Bean的后处理器。BEAN实例化后,属性设置完成,并在执行实现方法之前和之后进行自定义方法。
ProxyProcessorSupport类具有两个功能。首先是实现BeanClassLoadRaware接口设置类加载程序。> BeanClass,ProxyFactory ProxyFactory方法来确定Bean是否使用基于类的代理,如果不是,则添加需要代理的接口到代理厂。
以下重点是以下三个类别
对于这三篇文章,Spring aop(3)顾问顾问建议,顾问,建议?Spring AOP的顾问,PointCutAdvisor,IntroidActionAdvisor,简介InternInterceptor
该类仅实现更多的BeanFactoryAware接口。为了获得beanFactory,重写父级准备eproxyfactory和不合格的方法。
这是一个非常关键的步骤,生成异步范围内的实例继续看内部。如何拦截异步方法以及如何调用逻辑,继续看不起。
这类异步范围的遗传关系如下
PointCutAdvisor界面是由顾问驱动器驱动的,因此AsyncannotationAdvisor是建议和PointCut的顾问。类别代码如下如下
让我们谈谈AntationSationAsyncucutionTercepor和AnnotationMatchingPointCut的两类。阅读了这两个类别后,整个异步处理基本上已经结束。
AnnotationAsyncessCecution Interceth
拦截器是通用拦截器接口的抽象,它是一个空界面。
MethodInterceptor是一种方法拦截器。有一个对象调用(方法引发涉及)方法。该方法可以在方法调用之前和之后重写为自定义逻辑。源代码中提供的示例(关于方法i裂术可以参考本文SpringMethod interceptor Methodceptor)
AsyncexecutionAspectSuppopport是执行基类的异步方法,可实现BeanFactoryware接口。您可以获取豆厂。
有关完整的未来类,请参阅本文完整的原始分析
让我们看一下AsyncexecutionInterceptor的类。此类是处理异步方法处理的方法
最后,查看最终实例化的antationAsyNecexCucutiontersceptor
在这一点上,AsyncannotationAdvisor的建议属性已经完成
点数buildpointcut中的AnnotationMatchingPointCut(setCutcut indentpointcut(setCut)
调用时,它将输入对象Internet(Object代理,方法,对象[] Args,MethodProxy MethodProxy)方法中的DynamicAdvisEspific operation.in AbstractAdvisIninPonpostProcesor类,
当红色框生成代理对象时,将调用cglibaopproxy类的getproxy方法
将调用getCallbacks方法以获取回调
在获取回调的方法中,它将直接新一个动态贴上的Interpector。将此方法拦截器设置为回调。调用异步方法
DynamicAdviseIdinterceptor具有建议的支持属性。该属性实际上是从异步后处理器的顾问中获取的,然后执行了新的cglibmethodinvocation。asyncexecutionInterceptor的调用方法将任务放在线程池中执行它,然后处理返回值。整个过程结束了。
整个过程首先在项目启动阶段,通过@EnableAsync注释引入一些配置类,最后实例化异步后处理器(AsyncannotationBeanBeanPostProcessor)。该后处理器具有自己的入口点和处理逻辑,如果bean符合后处理器的起点,则将拦截项目中的所有豆子,然后SpringBoot将通过AOP生成代理对象。当生成代理对象时,将设置回调。Logic(实际逻辑是将异步方法放入线程池中),并将此代理对象注入所使用的位置。
当真正调用异步方法时,由于注入代理对象,因此将在异步方法之前输入先前设置的回调。执行完成后,将根据不同的返回值处理返回值。执行已完成。整个文章仍然有点抽象。过程描述未详细介绍。它只是描述了每个类的功能。我想在以前绘制时间序言,但是由于调用太多绘画的方法很复杂,因此强烈建议在应用程序开始时读取读者 - 在呼叫阶段设置断点,并且调试将是更易于理解的步骤逐步。
阅读@ASYNC源代码后,仍然有很多意义。首先,源代码结构的设计确实非常好。许多想法可以用于参考并引入他们自己的项目。第二,源代码的想法之一是,从上到下,从父级到子类,父级,父界面到子接口到子接口,对于每个类,确定如何实例化,如何设置每个属性,有哪些方法?每个方法的每一行都完成。最后,在粗略阅读它之后,将断点设置为逐步,并在调试时查看每个类的结构。这将对某个类别进行总体掌握。
当然,源代码非常复杂,有些地方看不到很好。当我看到@ASYNC源代码时,有些地方不明白。例如,AOP之一,将来会有机会看看它。收获后,您可以得到它。
原始:https://juejin.cn/post/7097521638119309319