/** * 装饰器-将主线程上下文传入异步线程 * */ 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
浙公网安备 33010602011771号