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{
@Override
public void execute(Runnable task) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
super.execute(()->{
// 在任务执行前重新设置上下文
RequestContextHolder.setRequestAttributes(attributes);
try{
task.run();
}finally {
// 清理上下文
RequestContextHolder.resetRequestAttributes();
}
});
}
}
如何实现在线程池中执行远程调用可以获取到主线程的请求上下文
最新推荐文章于 2025-04-29 15:27:41 发布