当前位置: 首页 > news >正文

泉州住房和城乡建设局网站深圳动画制作

泉州住房和城乡建设局网站,深圳动画制作,丰镇网站建设,电商平台项目计划书目录- [Spring的Async注解线程池扩展方案]- [目录]- [1. 扩展目的]- [2. 扩展实现]- [2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor]- [2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor]- [2.3 扩展Async注解的 Spring Bean 后置处理器AsyncAn…目录  - [Spring的Async注解线程池扩展方案]  - [目录]  - [1. 扩展目的]  - [2. 扩展实现]  - [2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor]  - [2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor]  - [2.3 扩展Async注解的 Spring Bean 后置处理器AsyncAnnotationBeanPostProcessor]  - [2.4 扩展代理异步配置类ProxyAsyncConfiguration]  - [2.5 扩展异步代理配置选择器AsyncConfigurationSelector]  - [2.6 扩展异步启动注解EnableAsync]  - [3. 额外扩展给Async注解代理指定线程池]扩展目的  1. 异步调用改用Spring提供的Aysnc注解实现代替手写线程池执行。  2. 在实际场景中可能会遇到需要将主线程的一些个性化参数、变量、数据传递到子线程中使用的需求。  3. InheritableThreadLocal可以解决子线程继承父线程值的需求但是它存在一些问题。  1. SessionUser.SESSION_USER是中台提供无法修改。  2. InheritableThreadLocal在线程池机制应用中并不友好不及时在子线程中清除的话会造成线程安全问题。  实现思路有两种  1. 针对ThreadLocal进行扩展并说服中台统一改用扩展后的ThreadLocal。  2. 针对EnableAsync和Async注解进行扩展将手动copy的代码写入到Spring代理类中。  第一种要跟中台打交道就很烦能够天平自己独立解决就自己解决。第二种会是一个不错的选择扩展实现也并不困难。  2. 扩展实现  2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor  类全名org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor  从调试记录可以分析得出AnnotationAsyncExecutionInterceptor#invoke方法正是创建异步任务并且执行异步任务的核心代码所在我们要做的就是重写这个方法将父线程的运行参数手动copy到子线程任务体中。  2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor  我们依靠追踪AnnotationAsyncExecutionInterceptor的构造方法调用定位到了它。  全类名org.springframework.scheduling.annotation.AsyncAnnotationAdvisor   补充说明代理顾问(Advisor)、建议(Advice)以及Spring代理实现原理     Spring EnableAsync默认的代理模式是 JDK 代理代理机制如下     Spring 一个 Bean 会在 BeanPostProcessor#postProcessAfterInitialization()这个生命周期环节遍历所有的BeanPostProcessor实例判断Bean是否符合代理条件如果符合代理条件就给 Bean 代理对象中追加建议(Advice)对象这样就完成了代理。     而建议(Advice)对象是由顾问(Advisor)对象创建和提供。     上一小节提到的异步执行拦截器AnnotationAsyncExecutionInterceptor就是实现了Advice接口的类。  在Async注解的代理过程中异步执行拦截器AnnotationAsyncExecutionInterceptor就是通过AsyncAnnotationAdvisor#buildAdvice方法创建的。  所以当我们想要将扩展的新的异步执行拦截器LibraAnnotationAsyncExecutionInterceptor用起来则需要相应的还要把AsyncAnnotationAdvisor#buildAdvice方法重写。  2.3 扩展Async注解的 Spring Bean 后置处理器AsyncAnnotationBeanPostProcessor  我们依靠追踪AsyncAnnotationAdvisor的构造方法调用定位到了它。  类全名org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor  这个没什么好说的Spring Bean 的生命周期其中一环。是 Spring Bean 实现代理的起点。  开发人员可以自定义一个BeanPostProcessor类把它注册到 Bean 容器中它就会自动生效并将后续的每一个 Bean 实例进行条件判断以及进行代理。  我们要重写的方法是AsyncAnnotationBeanPostProcessor#setBeanFactory。这个方法构造了异步代理顾问AsyncAnnotationAdvisor对象。  2.4 扩展代理异步配置类ProxyAsyncConfiguration  AsyncAnnotationBeanPostProcessor不是一般的 Spring Bean。它有几个限制导致它不能直接通过Component或者Configuration来创建实例。AsyncAnnotationBeanPostProcessor仅仅是实现了基于 JDK 代理如果开发决定另外一种(基于ASPECTJ编织)那么它就应该受到某种条件判断来进行 Bean 实例化。  2. AsyncAnnotationBeanPostProcessor还需要配置指定的线程池、排序等等属性所以无法直接使用Component注解注册为 Bean。  我们阅读一下EnableAsync注解源码Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)DocumentedImport(AsyncConfigurationSelector.class)publicinterfaceEnableAsync{Class?extendsAnnotationannotation()defaultAnnotation.class;booleanproxyTargetClass()defaultfalse;AdviceModemode()defaultAdviceMode.PROXY;intorder()defaultOrdered.LOWEST_PRECEDENCE;}进一步阅读AsyncConfigurationSelector的源码publicclassAsyncConfigurationSelectorextendsAdviceModeImportSelectorEnableAsync{privatestaticfinalString ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME org.springframework.scheduling.aspectj.AspectJAsyncConfiguration;/*** 分别为EnableAsync.mode()的PROXY和ASPECTJ值返回{linkProxyAsyncConfiguration}或{codeAspectJAsyncConfiguration} 。*/OverrideNullablepublicString[]selectImports(AdviceMode adviceMode){switch(adviceMode){case PROXY:returnnewString[]{ProxyAsyncConfiguration.class.getName()};case ASPECTJ:returnnewString[]{ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME};default:returnnull;}}}谜底揭晓ProxyAsyncConfiguration原来是在这里开始注册到 Spring 容器中的。  Spring Boot 启动后会根据EnableAsync注解的mode()方法的具体值来决定整个Spring的 Bean 代理机制。  既然 Spring 代理机制只会有一种所以也就只会在两种机制的配置类中选择其中一个来进行实例化。  而默认EnableAsync$mode()默认值是AdviceMode.PROXY所以默认采用 JDK 代理机制。  2.5 扩展异步代理配置选择器AsyncConfigurationSelector  类全名org.springframework.scheduling.annotation.AsyncConfigurationSelector  2.6 扩展异步启动注解EnableAsync  类全名org.springframework.scheduling.annotation.EnableAsync  3. 额外扩展给Async注解代理指定线程池  Async会自动根据类型TaskExecutor.class从 Spring Bean 容器中找一个已经实例化的异步任务执行器(线程池)。如果找不到则另寻他路尝试从 Spring Bean 容器中查找名称为taskExecutor的Executor.class实例。最后都还是未找到呢就默认自动new一个SimpleAsyncTaskExecutor来用。   补充说明TaskExecutor.class是Spring定义的而Executor.classJDK定义的。  场景其他小伙伴、或者旧代码已经实现过了一个线程池但是这个线程池是个Executor.class类型且 Bean 实例名称不是taskExecutor(假设是libraThreadPool)正常情况下Async根本无法找到它。  需求通过配置将Async的默认线程池指定为名为libraThreadPool的Executor.class类型线程池。  我们只需要注册一个实现AsyncConfigurer接口的配置类  org.springframework.scheduling.annotation.AbstractAsyncConfiguration#setConfigurers/*** Collect any {linkAsyncConfigurer} beans through autowiring.*/Autowired(required false)voidsetConfigurers(CollectionAsyncConfigurer configurers){if(CollectionUtils.isEmpty(configurers)){return;}if(configurers.size()1){thrownewIllegalStateException(Only one AsyncConfigurer may exist);}AsyncConfigurer configurer configurers.iterator().next();this.executor configurer::getAsyncExecutor;this.exceptionHandler configurer::getAsyncUncaughtExceptionHandler;}
http://www.hkea.cn/news/14484769/

相关文章:

  • 紫金网站制作策划做文案的网站有些什么
  • 河南省和城乡建设厅网站首页今天重庆发生大新闻
  • 建设网站需要营业执照装饰设计乙级资质承接范围
  • 为什么淘宝店主不自己做电商网站做网站需要学些什么软件
  • 嘉兴建设中学网站wordpress 片刻主题
  • 网站建设基本流程规范用新域名做网站排名快吗
  • 品牌网站建设 结构reactjs 做网站
  • 什么是指定网站的域名html在线模板
  • 论坛网站如何备案上海网络维护公司20强
  • 有一个外国网站专门做街头搭讪怎么用自己电脑当服务器建设网站
  • 网站制作评价标准wordpress本地备份
  • 资阳网站优化万网备案初审过了后网站能访问吗
  • 网站的建设与维护有什么作用dewplayer wordpress
  • 关于美术馆网站建设的方案网站赚钱
  • 网站源码分享网服装设计师参考的网站
  • 企业做网站设计手机网站开发需求 百度云盘
  • 淘宝怎么才能发布网站建设建筑网格组织
  • 可以直接做室内su的网站社交网络的推广方法有哪些
  • 网站开发合同需要交印花税吗网站单页面
  • 免费服务器ip上海企业seo
  • 东莞免费建站在线咨询广西外贸app
  • 网页区设计网站诊断软件开发主要是干什么的
  • 天河区网站建设公司做外包软件的网站
  • 网站专项审批查询天津网站建设求职简历
  • 网站设计遇到的问题吴江区建设工程招标网站
  • wordpress安装出错大连 祥云 网站优化
  • 福田附近做网站公司做网站数据库怎么建
  • 北京市专业网站制作企业word上下页纸张方向
  • 官网优化哪家专业大型网站建设优化排名
  • 汽车网站建设页面工业设计最吃香的专业