【问题标题】:How to define multiple qualified thread pools with AsyncConfigurer如何使用 AsyncConfigurer 定义多个合格的线程池
【发布时间】:2016-11-09 10:34:00
【问题描述】:

Spring 框架有一个接口 AsyncConfigurer(和 AsyncConfigurerSupport),用于配置拥有线程池执行器和能够异步运行方法(使用 @Async)所需的一切。

但通常情况下,在不同功能之间共享同一个线程池并不是一个好习惯,因此我通常用一个名称对它们进行限定,并在 Async 注释中指定该名称以使其使用一个特定的线程池。

问题是,我想通过这个方便的接口 AsyncConfigurer 来配置它们,并且不失资格,但我做不到。

试试这个:

    @Configuration
    @EnableAsync
    public class PusherAsyncConfigurerSupport extends AsyncConfigurerSupport {
        @Autowired
        ExecutorConfig config;
        @Override
        @Qualifier(value = "executorOne")
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(config.getCorePoolSize());
            ...
            executor.initialize();
            return executor;
        }

        @Override
        public AsyncUncaughtExceptionHandler     getAsyncUncaughtExceptionHandler() {
            return new MyAsyncUncaughtExceptionHandler();
        }
    }

当放入 Async 注释时,仍然无法识别该线程池。

那么,这样配置多个线程池需要什么?或者根本就不是这样?

【问题讨论】:

  • 你怎么知道池没有被识别?
  • @kuhajeyan,它抛出一个异常,说没有那个名字的执行者。

标签: java spring asynchronous


【解决方案1】:

用@Bean注解标记

@Bean
@Qualifier(value = "executorOne")
public Executor getAsyncExecutor() {
//..
  return executor;
}

【讨论】:

  • 如此简单,成功了! (但有@Bean(name = "executorOne")。我期待更多来自春天的魔法。
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 2019-07-07
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2019-11-08
  • 2015-03-28
相关资源
最近更新 更多