package com.zbkj.admin.config; import lombok.Data; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; /** * Task类的线程配置 */ @Data @Configuration public class TaskExecutorConfig { //普通模式 private final int taskCorePoolSize = 20; //核心线程池数量 private final int taskMaxPoolSize = 100; //最大线程 private final int taskQueueCapacity = 200; //缓存队列条数 private final int taskKeepAliveSecond = 10; //允许的空闲时间 private final String taskNamePrefix = "task-executor-"; //线程名称前缀 //发布订阅模式 // private final int listenerCorePoolSize = 3; // private final int listenerMaxPoolSize = 20; // private final int listenerQueueCapacity = 200; // private final int listenerKeepAliveSecond = 10; // private final String listenerNamePrefix = "listener-executor-"; //普通模式 @Bean("taskExecutor") public ThreadPoolTaskExecutor taskExecutor(){ return initTaskExecutor( getTaskCorePoolSize(), getTaskMaxPoolSize(), getTaskQueueCapacity(), getTaskKeepAliveSecond(), getTaskNamePrefix() ); } // //针对发布订阅(pub listener) 的线程池 // @Bean("listenerTaskExecutor") // public ThreadPoolTaskExecutor listenerTaskExecutor(){ // return initTaskExecutor(getListenerCorePoolSize(), getListenerMaxPoolSize(), // getListenerQueueCapacity(), getListenerKeepAliveSecond(), getListenerNamePrefix()); // } /** * * 初始化TaskExecutor * @param corePoolSize int 默认线程数 * @param maxPoolSize int 最大线程数 * @param queueCapacity int 缓冲队列长度 * @param keepAliveSecond int 允许空闲时间 * @param namePrefix String 名称的前缀 * * @return ThreadPoolTaskExecutor */ private ThreadPoolTaskExecutor initTaskExecutor(int corePoolSize, int maxPoolSize, int queueCapacity, int keepAliveSecond, String namePrefix){ //callrunspolicy:由调度线程(提交任务的线程)处理该任务CallerRunsPolicy return initTaskExecutor(corePoolSize, maxPoolSize, queueCapacity, keepAliveSecond, namePrefix, new ThreadPoolExecutor.CallerRunsPolicy()); } /** * 初始化TaskExecutor * @param corePoolSize int 默认线程数 * @param maxPoolSize int 最大线程数 * @param queueCapacity int 缓冲队列长度 * @param keepAliveSecond int 允许空闲时间 * @param namePrefix String 名称的前缀 * @param rejectedExecutionHandler 线程池满的时候如何处理 * @return ThreadPoolTaskExecutor */ private ThreadPoolTaskExecutor initTaskExecutor(int corePoolSize, int maxPoolSize, int queueCapacity, int keepAliveSecond, String namePrefix, RejectedExecutionHandler rejectedExecutionHandler){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize);//核心线程数(默认线程数) executor.setMaxPoolSize(maxPoolSize);//最大线程数 executor.setQueueCapacity(queueCapacity);//缓冲队列数 executor.setKeepAliveSeconds(keepAliveSecond);//允许线程空闲时间(单位默认为秒) executor.setThreadNamePrefix(namePrefix);//线程名前缀 //线程池对拒绝任务的处理策略, executor.setRejectedExecutionHandler(rejectedExecutionHandler); //初始化 executor.initialize(); return executor; } }