如何为Async Spring使用多个threadPoolExecutor

时间:2017-08-19 21:33:23

标签: java spring asynchronous spring-boot

我在两个类上使用Spring @Async。两者都最终实现了一个接口。我正在创建两个单独的ThreadPoolTask​​Executor,因此每个类都有自己的ThreadPool来处理。但是由于我认为使用代理以及Spring如何实现异步类,我必须将@Async注释放在基接口上。因此,两个类最终都使用相同的ThreadPoolTask​​Executor。 是否有可能告诉Spring对于这个Bean(在这种情况下我调用实现该接口的类的一个Service),使用这个ThreadPoolTask​​Executor。

1 个答案:

答案 0 :(得分:6)

默认情况下,在方法上指定@Async时,将使用的执行程序是提供给“注释驱动”元素的执行程序,如here所述。

但是,当需要指示在执行给定方法时应该使用除默认值之外的执行程序时,可以使用@Async注释的value属性。

@Async("otherExecutor")
void doSomething(String s) {
    // this will be executed asynchronously by "otherExecutor"
}

在这种情况下,“otherExecutor”可以是Spring容器中任何Executor bean的名称,也可以是与任何Executor关联的限定符的名称,例如:使用元素或Spring的@Qualifier注释

指定

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

您可能需要在应用中使用所需的池设置指定otherExecutor bean。

@Bean
public TaskExecutor otherExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(25);

    return executor;
}