Java 始终调用Spring自定义ThreadPoolTaskExecutor
我正在尝试将Spring上下文复制到特殊情况下的可运行/可调用任务。我希望其他线程像以前一样运行 我读过这个 并实现了一个自定义ThreadPoolTaskExecutor+装饰器Java 始终调用Spring自定义ThreadPoolTaskExecutor,java,spring,spring-boot,java.util.concurrent,Java,Spring,Spring Boot,Java.util.concurrent,我正在尝试将Spring上下文复制到特殊情况下的可运行/可调用任务。我希望其他线程像以前一样运行 我读过这个 并实现了一个自定义ThreadPoolTaskExecutor+装饰器 @Configuration public class ContextCopyConfig { private Integer connectionsLimit=10; @Bean(name = "contextExecutor") public Executor contextExecu
@Configuration
public class ContextCopyConfig {
private Integer connectionsLimit=10;
@Bean(name = "contextExecutor")
public Executor contextExecutor() {
ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
poolExecutor.setTaskDecorator(new ContextCopyingDecorator());
poolExecutor.setMaxPoolSize(connectionsLimit);
poolExecutor.setCorePoolSize(connectionsLimit);
poolExecutor.initialize();
return poolExecutor;
}
}
我计划按如下方式使用该遗嘱执行人:
@Autowired
@Qualifier(value = "contextExecutor")
private Executor contextExecutor;
public void parallelHere() throws IOException, InterruptedException, ExecutionException {
Collection<Callable<Pair<String, OutputStream>>> tasks = new ArrayList<>(); //some tasks
//ExecutorService executor = Executors.newFixedThreadPool(connectionsLimit);
List<Future<Pair<String, OutputStream>>> results = ((ThreadPoolTaskExecutor) contextExecutor).getThreadPoolExecutor().invokeAll(tasks);
((ThreadPoolTaskExecutor) contextExecutor).getThreadPoolExecutor().shutdown(); //always reclaim resources
}
@Autowired
@限定符(value=“contextExecutor”)
私人遗嘱执行人;
public void parallelHere()引发IOException、InterruptedException、ExecutionException{
集合任务=新建ArrayList();//某些任务
//ExecutorService executor=Executors.newFixedThreadPool(connectionsLimit);
列表结果=((ThreadPoolTaskExecutor)contextExecutor.getThreadPoolExecutor().invokeAll(任务);
((ThreadPoolTaskExecutor)contextExecutor.getThreadPoolExecutor().shutdown();//始终回收资源
}
但是,contextExecutor总是被调用(在任何线程中!)。
我如何修复它?此帖子:
描述了该问题。仅当用户未创建自定义执行器时,Springboot才会创建默认执行器。
在SpringBoot 2+中,您必须使用
@AutoConfigureAfter(TaskExecutionAutoConfiguration.class)
在自定义配置上
但是,在以前的Spring版本中,不存在TaskExecutionAutoConfiguration,Executor由工厂创建。使用下面的行,您可以创建由Spring创建的默认executor的exect副本
@Primary
@Bean
//see package org.springframework.aop.interceptor.AsyncExecutionInterceptor
public Executor getDefaultExecutor(){
// Executor defaultExecutor = super.getDefaultExecutor(beanFactory);
// return (defaultExecutor != null ? defaultExecutor : new SimpleAsyncTaskExecutor());
return new SimpleAsyncTaskExecutor();
}