解决异步任务上下文丢失问题

  1. 上下文丢失主要是因为主线程和子线程的上下文不能共享。
  2. 可以通过执行异步任务之前,将主线程上的上下文信息拷贝到子线程上。

通过自定义 TaskDecorator 来拷贝主线程上的上下文信息到子线程,然后将自定义的 TaskDecorator实现类 设置到线程池上。

@Configuration
public class ThreadPoolConfig {

    @Bean(name = "customizeTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
        // 核心线程数=cpu核心数+1
        poolExecutor.setCorePoolSize(5);
        // 最大线程数=cpu核心数*2
        poolExecutor.setMaxPoolSize(8);
        // 设置任务装饰器
        poolExecutor.setTaskDecorator(taskDecorator());
        // 任务被拒绝后,交给调用线程执行
        poolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return poolExecutor;
    }

    @Bean
    public TaskDecorator taskDecorator(){
        return new TaskDecorator() {
            @Override
            public Runnable decorate(Runnable runnable) {
                RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
                return ()->{
                    try {
                        RequestContextHolder.setRequestAttributes(requestAttributes);
                        runnable.run();
                    }finally {
                        RequestContextHolder.resetRequestAttributes();
                    }
                };
            }
        };
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值