任务执行和调度
在上下文中没有 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
命名空间进行微调,如下例所示
-
属性
-
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
命名空间进行微调,如下例所示
-
属性
-
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
bean。如果启用了 SimpleAsyncTaskExecutorBuilder
和 SimpleAsyncTaskSchedulerBuilder
bean(使用 Java 21+ 和将 spring.threads.virtual.enabled
设置为 true
),则会自动配置它们以使用虚拟线程。