成功解决使用Callable处理接收请求时,异步处理线程名不是配置的线程名

当我们使用Callable来异步接收请求时

@Controller
public class AsyncRequestController {

    @RequestMapping("async")
    @ResponseBody
    public Callable async(){
        System.out.println(" 当前线程 外部 " + Thread.currentThread().getName());
        Callable callable = new Callable() {
            @Override
            public String call() throws Exception {
                System.out.println(" 当前线程 内部 " + Thread.currentThread().getName());
                return "success";
            }
        };
        return callable;
    }
}

需要先配置异步请求处理线程池,配置如下

package com.fdw.study.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.context.request.async.TimeoutCallableProcessingInterceptor;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.concurrent.ThreadPoolExecutor;

@ComponentScan(basePackages = "com.fdw.study.*")
@Configuration
@EnableAsync
public class DefultConfig extends WebMvcConfigurationSupport {
    
    @Override
    public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(60 * 1000L);
        configurer.registerCallableInterceptors(timeoutInterceptor());
        configurer.setTaskExecutor(asyncTaskExecutor());
    }
    @Bean
    public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
        return new TimeoutCallableProcessingInterceptor();
    }
    @Bean
    public AsyncTaskExecutor asyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        //核心线程数:线程池创建时候初始化的线程数
        //最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        //缓冲队列:用来缓冲执行任务的队列
        //允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        //线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
        //线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(200);
        executor.setKeepAliveSeconds(60);
        executor.setThreadNamePrefix("taskExecutor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
    
}

但测试接口时,输出的异步处理线程名却不是以配置的“taskExecutor-”开头

解决办法:

        不要使用extends WebMvcConfigurationSupport的方式来配置异步请求线程池,而是使用implements WebMvcConfigurer来配置,重写的方法是一样的。

成功解决使用Callable处理接收请求时,异步处理线程名不是配置的线程名_第1张图片

测试结果:

成功解决使用Callable处理接收请求时,异步处理线程名不是配置的线程名_第2张图片 

这下对了! 

 

你可能感兴趣的:(java,开发语言,异步)