/**
* 线程池装配类、线程池优雅停机控制
*/
@Configuration
public class FeedBackExecutorConfig implements ApplicationListener<ContextClosedEvent> {
/**
* 反馈处理线程池
*/
private ThreadPoolTaskExecutor mailEventPullThreadPoolTaskExecutor;
@Bean
public ThreadPoolTaskExecutor mailEventPullThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/* 最大线程数*/
executor.setMaxPoolSize(50);
/* 核心线程数*/
executor.setCorePoolSize(20);
/* 任务队列的大小*/
executor.setQueueCapacity(200);
/*线程前缀名*/
executor.setThreadNamePrefix("feedback-");
/* 线程存活时间*/
executor.setKeepAliveSeconds(60);
/**
* 拒绝处理策略
* CallerRunsPolicy():交由调用方线程运行,比如 main 线程。
* AbortPolicy():直接抛出异常。
* DiscardPolicy():直接丢弃。
* DiscardOldestPolicy():丢弃队列中最老的任务。
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
/* 线程池优雅停机*/
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(30);
/* 线程初始化*/
executor.initialize();
mailEventPullThreadPoolTaskExecutor = executor;
return executor;
}
@Override
public void onApplicationEvent(ContextClosedEvent event) {
/* ContextClosedEvent 时间会在销毁bean之前执行,可保证task还在执行的时候不会销毁所依赖的bean,
* 这样配合设置线程池的优雅停机配置来做到线程池的优雅停机*/
if (mailEventPullThreadPoolTaskExecutor != null) {
mailEventPullThreadPoolTaskExecutor.shutdown();
}
}
}