package com.njcn.jbsyncdata.config; import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; /** * @author hongawen * @version 1.0.0 * @date 2022年03月11日 09:32 */ @Data @Order(100) @Configuration @EnableAsync @AllArgsConstructor public class AsyncConfiguration { private final GeneralInfo generalInfo; @Bean("asyncExecutor") public Executor asyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 核心线程数:线程池创建时候初始化的线程数 executor.setCorePoolSize(generalInfo.getCorePoolSize()); // 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程 executor.setMaxPoolSize(generalInfo.getMaxPoolSize()); // 缓冲队列:用来缓冲执行任务的队列 executor.setQueueCapacity(generalInfo.getQueueCapacity()); // 允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁 executor.setKeepAliveSeconds(generalInfo.getKeepAliveSeconds()); // 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池 executor.setThreadNamePrefix(generalInfo.getMicroServiceName()); // 缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程) executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }