Task Execution and Scheduling
In the absence of an Executor
bean in the context, Spring Boot auto-configures an AsyncTaskExecutor
.
When virtual threads are enabled (using Java 21+ and spring.threads.virtual.enabled
set to true
) this will be a SimpleAsyncTaskExecutor
that uses virtual threads.
Otherwise, it will be a ThreadPoolTaskExecutor
with sensible defaults.
In either case, the auto-configured executor will be automatically used for:
-
asynchronous task execution (
@EnableAsync
) -
Spring for GraphQL’s asynchronous handling of
Callable
return values from controller methods -
Spring MVC’s asynchronous request processing
-
Spring WebFlux’s blocking execution support
If you have defined a custom The auto-configured |
When a ThreadPoolTaskExecutor
is auto-configured, the thread pool uses 8 core threads that can grow and shrink according to the load.
Those default settings can be fine-tuned using the spring.task.execution
namespace, as shown in the following example:
-
Properties
-
YAML
spring.task.execution.pool.max-size=16
spring.task.execution.pool.queue-capacity=100
spring.task.execution.pool.keep-alive=10s
spring:
task:
execution:
pool:
max-size: 16
queue-capacity: 100
keep-alive: "10s"
This changes the thread pool to use a bounded queue so that when the queue is full (100 tasks), the thread pool increases to maximum 16 threads. Shrinking of the pool is more aggressive as threads are reclaimed when they are idle for 10 seconds (rather than 60 seconds by default).
A scheduler can also be auto-configured if it needs to be associated with scheduled task execution (using @EnableScheduling
for instance).
If virtual threads are enabled (using Java 21+ and spring.threads.virtual.enabled
set to true
) this will be a SimpleAsyncTaskScheduler
that uses virtual threads.
This SimpleAsyncTaskScheduler
will ignore any pooling related properties.
If virtual threads are not enabled, it will be a ThreadPoolTaskScheduler
with sensible defaults.
The ThreadPoolTaskScheduler
uses one thread by default and its settings can be fine-tuned using the spring.task.scheduling
namespace, as shown in the following example:
-
Properties
-
YAML
spring.task.scheduling.thread-name-prefix=scheduling-
spring.task.scheduling.pool.size=2
spring:
task:
scheduling:
thread-name-prefix: "scheduling-"
pool:
size: 2
A ThreadPoolTaskExecutorBuilder
bean, a SimpleAsyncTaskExecutorBuilder
bean, a ThreadPoolTaskSchedulerBuilder
bean and a SimpleAsyncTaskSchedulerBuilder
are made available in the context if a custom executor or scheduler needs to be created.
The SimpleAsyncTaskExecutorBuilder
and SimpleAsyncTaskSchedulerBuilder
beans are auto-configured to use virtual threads if they are enabled (using Java 21+ and spring.threads.virtual.enabled
set to true
).