I did a @Service
class in Spring Boot application with one of the methods that should run asynchronously. As I read method should be @Async
annotat
First – let’s go over the rules – @Async has two limitations:
So your processPage() method should be in separate class
UPDATE: as of Spring Boot 2.2, one need not create the ThreadPoolTaskExecutor
through code. Indeed, ThreadPoolTaskExecutor
is the default, and can be completely configured using properties prefixed with spring.task.execution
.
So, steps:
@EnableAsync
in a @Configuration
-annotated class,@Async
ThreadPoolTaskExecutor
config with propertiesProperties 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())
}
}
}
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
).