此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.0! |
任务执行和调度
在没有Executor
bean 中,Spring Boot 会自动配置一个AsyncTaskExecutor
.
启用虚拟线程后(使用 Java 21+ 和spring.threads.virtual.enabled
设置为true
),这将是一个SimpleAsyncTaskExecutor
使用虚拟线程。
否则,它将是一个ThreadPoolTaskExecutor
具有合理的默认值。
在任何一种情况下,自动配置的执行程序都将自动用于:
-
异步任务执行 (
@EnableAsync
) -
Spring for GraphQL 对
Callable
从控制器方法返回值 -
Spring MVC 的异步请求处理
-
Spring WebFlux 的阻塞执行支持
如果您定义了自定义 自动配置的 |
当ThreadPoolTaskExecutor
是自动配置的,则线程池使用 8 个核心线程,这些线程可以根据负载进行扩展和收缩。
这些默认设置可以使用spring.task.execution
namespace 中,如以下示例所示:
-
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"
这会将线程池更改为使用有界队列,以便在队列已满(100 个任务)时,线程池增加到最多 16 个线程。 池的收缩更加激进,因为线程在空闲 10 秒(而不是默认 60 秒)时被回收。
如果需要将调度程序与计划任务执行相关联(使用@EnableScheduling
例如)。
如果启用了虚拟线程(使用 Java 21+ 和spring.threads.virtual.enabled
设置为true
),这将是一个SimpleAsyncTaskScheduler
使用虚拟线程。
这SimpleAsyncTaskScheduler
将忽略任何与池化相关的属性。
如果未启用虚拟线程,它将是一个ThreadPoolTaskScheduler
具有合理的默认值。
这ThreadPoolTaskScheduler
默认使用一个线程,并且可以使用spring.task.scheduling
namespace 中,如以下示例所示:
-
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
一个ThreadPoolTaskExecutorBuilder
bean、一个SimpleAsyncTaskExecutorBuilder
bean、一个ThreadPoolTaskSchedulerBuilder
bean 和SimpleAsyncTaskSchedulerBuilder
在上下文中可用。
这SimpleAsyncTaskExecutorBuilder
和SimpleAsyncTaskSchedulerBuilder
如果启用了 bean,则 bean 会自动配置为使用虚拟线程(使用 Java 21+ 和spring.threads.virtual.enabled
设置为true
).