Java 始终调用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

我正在尝试将Spring上下文复制到特殊情况下的可运行/可调用任务。我希望其他线程像以前一样运行

我读过这个

并实现了一个自定义ThreadPoolTaskExecutor+装饰器

@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();
}