Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)

背景

在这里插入图片描述

  • requestMappingHandlerMapping: defined by method ‘requestMappingHandlerMapping’ in class path resource [com/works/framework/config/WebMvcConfig.class]
    - controllerEndpointHandlerMapping: defined by method ‘controllerEndpointHandlerMapping’ in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/servlet/WebMvcEndpointManagementContextConfiguration.class]

意外发现

  • 我找到创建requestMappingHandlerMapping的地方是WebMvcAutoConfiguration。这块是Spring Boot自动装配的代码。
    在这里插入图片描述

  • 我想requestMappingHandlerMapping框架自动配置了,那异步可以自动配置吗?

  • 于是我搜索关键字configureAsyncSupport,还真的有自动配置异步的方法。如下图所示。
    在这里插入图片描述

  • 只要有Bean的名称是TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME并且是属于AsyncTaskExecutor的对象,那就能自动配置异步处理的线程池了。

  • 另外,TaskExecutionAutoConfiguration是自动配置线程池的配置类。
    在这里插入图片描述

  • 只要有对应的配置,就可以初始化线程池和异步,可以看出Spring Boot在约定配置这块很智能。

结论

  • 那么Spring MVC(Boot) Servlet 3.0异步处理,Callable方式就有3种方案了。

    • 继承WebMvcConfigurationSupport
    • 实现 WebMvcConfigurer 接口。
    • 创建Bean的名称是TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME并且是属于AsyncTaskExecutor的对象。
  • 我直接在我创建线程池的地方增加了一个BeanName。代码如下

	...省略...
	@Bean(name = {"threadPoolTaskExecutor",TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME})
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // 线程池对拒绝任务(无线程可用)的处理策略 ,CallerRunsPolicy 如果没有线程了,用主线程
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.setThreadNamePrefix("taskExecutor-");
        return executor;
    }
	...省略...

posted on 2023-04-17 20:00  愤怒的苹果ext  阅读(45)  评论(0编辑  收藏  举报  来源

导航