/**
 * 装饰器-将主线程上下文传入异步线程
 * 
 */
public class JalorContextDecorator implements TaskDecorator {
    @Override
    public Runnable decorate(Runnable runnable) {
        // 主线程中的jalor上下文
        IRequestContext ctx = RequestContext.getCurrent(true);
        return () -> {
            // 将主线程的jalor上下文,设置到子线程中
            RequestContextManager.setCurrent(ctx);
            // 执行子线程
            runnable.run();
        }
    }
}
/**
 * 异步任务配置类
 * 
 */
@Configuration
@EnableAsync // 开启异步任务支持
public class TaskExecutorConfig {
    /**
     * 自定义线程池名称
     *
     */
    public static final String TASK_POOL_NAME = "hardwareMsgAsyncHandlePool";

    /**
     * 自定义线程池名称:该线程池可以将主线程上下文从主线程带入
     */
    public static final String TASK_POOL_NAME_CONTAIN_JALOR_CONTEXT = "asyncContainsJalorContextPool";

    /**
     * 返回一个ThreadPoolTaskExecutor,获得了一个TaskExecutor
     * /
    @Bean(TASK_POOL_NAME)
    public Executor getAsyncExecutor() {
        return getExecutorByName(TASK_POOL_NAME);
    }

    /**
     * 创建一个可以将上下文从主线程代入的线程池
     * /
     @Bean(TASK_POOL_NAME_CONTAIN_JALOR_CONTEXT)
     public Executor getAsyncJalorContextExecutor() {
        ThreadPoolTaskExecutor taskExecutor = getExecutorByName(TASK_POOL_NAME_CONTAIN_JALOR_CONTEXT);
         taskExecutor.setTaskDecorator(new JalorContextDecorator());
         return taskExecutor;
     }

     private ThreadPoolTaskExecutor getExecutorByName(String taskPoolName){
         ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
         taskExecutor.setCorePoolSize(10);  // 核心线程数
         taskExecutor.setMaxPoolSize(20); // 最大线程数
         taskExecutor.setQueueCapacity(200); // 队列容量
         taskExecutor.setThreadNamePrefix(taskPoolName + "-"); // 设置线程名称前缀
         taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
         return taskExecutor;
    } 
}

 博文参考博客:https://blog.csdn.net/Maxiao1204/article/details/135084867

posted on 2024-06-21 00:28  人无名,则可专心练剑  阅读(108)  评论(0)    收藏  举报