public class ThreadPoolConfig {/*** 异步任务执行线程池** @return*/@Bean("taskExecutor")public TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new CustomThreadPoolExecutor();// 设置核心线程数executor.setCorePoolSize(5);// 设置最大线程数executor.setMaxPoolSize(500);// 设置队列容量executor.setQueueCapacity(200);// 设置线程活跃时间(秒)executor.setKeepAliveSeconds(60);// 设置默认线程名称executor.setThreadNamePrefix("processor-thread");// 设置拒绝策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}
}//对原本的线程池进行重写在执行任务先前去,获取主线程的请求信息更新到当前线程中
class CustomThreadPoolExecutor extends ThreadPoolTaskExecutor{@Overridepublic void execute(Runnable task) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();super.execute(()->{// 在任务执行前重新设置上下文RequestContextHolder.setRequestAttributes(attributes);try{task.run();}finally {// 清理上下文RequestContextHolder.resetRequestAttributes();}});}
}