I am using Spring @Async
on two classes. Both are ultimately implementing an interface. I am creating two separate ThreadPoolTaskExecutor
so each class has its own ThreadPool to work off of.
However, because I think something with proxy and how Spring implements Async classes, I have to put the @Async
annotation on the base interface. Because of this, both classes end up using the same ThreadPoolTaskExecutor
.
Is it possible to tell Spring that for this Bean (in this case I am calling the classes that implement that interface a Service), use this ThreadPoolTaskExecutor
?
By default when specifying @Async
on a method, the executor that will be used is the one supplied to the 'annotation-driven' element as described here.
However, the value attribute of the @Async
annotation can be used when needing to indicate that an executor other than the default should be used when executing a given method.
@Async("otherExecutor")
void doSomething(String s) {
// this will be executed asynchronously by "otherExecutor"
}
In this case, "otherExecutor" may be the name of any Executor bean in the Spring container, or may be the name of a qualifier associated with any Executor, e.g. as specified with the element or Spring’s @Qualifier
annotation
https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html
And probably you need to specify the otherExecutor bean in you app with the pool settings you wish.
@Bean
public TaskExecutor otherExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
return executor;
}