代码之家  ›  专栏  ›  技术社区  ›  membersound

如何在taskExecutionAutoConfiguration旁边创建其他taskExecutor?

  •  3
  • membersound  · 技术社区  · 7 年前

    我要弹簧加载默认值 ThreadPoolTaskExecutor 从 TaskExecutionAutoConfiguration . 尽管我想为一些明确的副任务提供可能拥有额外的执行器:

    @Bean
    public ThreadPoolExecutor myRequestPool() {
        return (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
    }
    

    问题:在上面添加bean, 任务执行自动配置 将不再执行,并且不会初始化Spring默认执行器,因为 @ConditionalOnMissingBean(Executor.class) 不再匹配:

    package org.springframework.boot.autoconfigure.task;
    
    public class TaskExecutionAutoConfiguration {
    
        @Lazy
        @Bean(name = APPLICATION_TASK_EXECUTOR_BEAN_NAME)
        @ConditionalOnMissingBean(Executor.class)
        public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
            return builder.build();
        }
    

    问题:我怎么还能让春天创造出两个豆子呢?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ken Chan    7 年前

    执行者进来了 TaskExecutionAutoConfiguration 仅当不存在其他执行器bean(由于 @ConditionalOnMissingBean(Executor.class) )在处理该自动配置时。因此,为了创建我们的执行者和 任务执行自动配置 ,我们需要确保我们的bean在 任务执行自动配置

    根据 docs ,如果我们让bean成为自动配置候选者(这需要添加 @Configuration 班在 META-INF/spring.factories ,然后我们可以使用 @AutoConfigureAfter 将其配置为在 任务执行自动配置 :

    package foo.bar.baz.qux;
    
    @Configuration
    @AutoConfigureAfter(TaskExecutionAutoConfiguration.class)
    public class Config {
        @Bean
        public ThreadPoolExecutor myRequestPool() {
            return (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
        }
    }
    

    然后创建 META-INF/Spring.工厂 其中包括:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      foo.bar.baz.qux.Config