Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)
背景
- 上篇Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable,我把
WebMvcConfig
代码(继承WebMvcConfigurationSupport )加入项目后,会报冲突的问题。如下所示。
- 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) 编辑 收藏 举报 来源