Spring boot. How to Create TaskExecutor with Annotation?
UPDATE: as of Spring Boot 2.1, there is no need to create the ThreadPoolTaskExecutor
through code, since ThreadPoolTaskExecutor
is the default and can be completely configured using properties prefixed with spring.task.execution
.
So, steps:
- use
@EnableAsync
in a@Configuration
-annotated class, - annotate one or more methods with
@Async
- optionally override the default
ThreadPoolTaskExecutor
config with properties
Properties example:
spring.task.execution.pool.core-size=1
spring.task.execution.pool.max-size=20
spring.task.execution.pool.keep-alive=120s
spring.task.execution.pool.queue-capacity=1000
spring.task.execution.shutdown.await-termination=true
spring.task.execution.shutdown.await-termination-period=5m
spring.task.execution.thread-name-prefix=async-executor-
spring.task.execution.pool.allow-core-thread-timeout=false
If more customization is required, one can also implement the TaskExecutorCustomizer
interface, for example (in kotlin):
@Component
class AsyncExecutorCustomizer : TaskExecutorCustomizer {
override fun customize(taskExecutor: ThreadPoolTaskExecutor?) {
taskExecutor?.let { executor ->
executor.setRejectedExecutionHandler(ThreadPoolExecutor.CallerRunsPolicy())
}
}
}
First – let’s go over the rules – @Async has two limitations:
- it must be applied to public methods only
- self-invocation – calling the async method from within the same class – won’t work
So your processPage() method should be in separate class
Add a @Bean
method to your Spring Boot application class:
@SpringBootApplication
@EnableAsync
public class MySpringBootApp {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
return executor;
}
public static void main(String[] args) {
// ...
}
}
See Java-based container configuration in the Spring Framework reference documentation on how to configure Spring using Java config instead of XML.
(Note: You don't need to add @Configuration
to the class because @SpringBootApplication
already includes @Configuration
).