SpringBoot结合自定义线程池异步处理

同步调用:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。

异步调用:只发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。

因为业务流程中可能出现调用后查库而进行写文件的流程,可能因为数据量过大引起TimeOut。用户无法快速拿到文件,所以采用异步处理的方法来先返回filepath和filename,然后让用户在某一段时间过后来获去文件。

SpringBoot可以通过@Async注解结合@EnableAsync来实现异步调用

@EnableAsync需要加在启动类上

@SpringBootApplication
@EnableAsync
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(Test.class, args);
    }
}

@Async加在需要实现异步任务的接口上

@Async("taskExecutor")
public void writeFile(RequestTask requestTask) {
    try {
       //To do
       .  .  .
    } catch (Exception e) {
        e.printStackTrace();
    }
}

taskExecutor为自定义线程池名称,可在yml文件或config类中配置线程池参数

@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
           //线程池处理task原理
/** 
 *   默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,
 *    当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
 *  当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝 
 */

    /** 核心线程数(默认线程数) */
    private static final int corePoolSize = 20;
    /** 最大线程数 */
    private static final int maxPoolSize = 100;
    /** 允许线程空闲时间(单位:默认为秒) */
    private static final int keepAliveTime = 10;
    /** 缓冲队列大小 */
    private static final int queueCapacity = 200;
    /** 线程池名前缀 */
    private static final String threadNamePrefix = "Async-Service-";

    @Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
    public ThreadPoolTaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);   
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveTime);
        executor.setThreadNamePrefix(threadNamePrefix);

        // 线程池对拒绝任务的处理策略

        // CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }
}


 


版权声明:本文为xiaohuihuiaz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。