前言
研发中有一些操作需要用到了异步调用,但是传递request的时候生命周期会提前结束,导致传递参数获取不到
示例
创建decorator
public class ContextDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable r) {
RequestAttributes context = RequestContextHolder.currentRequestAttributes();
return () -> {
try {
RequestContextHolder.setRequestAttributes(context);
r.run();
} finally {
RequestContextHolder.resetRequestAttributes();
}
};
}
}
image.png
配置线程池
@Configuration
public class TaskPoolConfig {
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数(默认线程数)
executor.setCorePoolSize(10);
// 最大线程数
executor.setMaxPoolSize(20);
// 缓冲队列数
executor.setQueueCapacity(200);
// 允许线程空闲时间(单位:默认为秒)
executor.setKeepAliveSeconds(60);
// 线程池名前缀
executor.setThreadNamePrefix("task-executor-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
// 增加 TaskDecorator 属性的配置
executor.setTaskDecorator(new ContextDecorator());
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
-end-