对于最新的稳定版本,请使用 Spring Boot 3.5.5spring-doc.cadn.net.cn

任务执行和调度

在没有Executorbean 时,Spring Boot 会自动配置AsyncTaskExecutor. 启用虚拟线程时(使用 Java 21+ 和spring.threads.virtual.enabled设置为true) 这将是一个SimpleAsyncTaskExecutor使用虚拟线程。 否则,它将是一个ThreadPoolTaskExecutor具有合理的默认值。 无论哪种情况,自动配置的执行器都将自动用于:spring-doc.cadn.net.cn

如果您定义了自定义Executor在上下文中,常规任务执行(即@EnableAsync)和 Spring for GraphQL 将使用它。 但是,Spring MVC 和 Spring WebFlux 支持仅在它是AsyncTaskExecutor实现(名为applicationTaskExecutor). 根据您的目标安排,您可以更改您的Executor变成一个AsyncTaskExecutor或同时定义AsyncTaskExecutorAsyncConfigurer包装您的自定义Executor.spring-doc.cadn.net.cn

自动配置的ThreadPoolTaskExecutorBuilder允许您轻松创建实例,以重现自动配置默认执行的作。spring-doc.cadn.net.cn

如果多个Executorbean 是定义的,常规任务执行回退到名为taskExecutor. GraphQL、Spring MVC 和 Spring WebFlux 支持回退到名为applicationTaskExecutor.spring-doc.cadn.net.cn

ThreadPoolTaskExecutor是自动配置的,线程池使用8个核心线程,可以根据负载增长和缩小。 这些默认设置可以使用spring.task.execution命名空间,如以下示例所示:spring-doc.cadn.net.cn

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 秒)时被回收。spring-doc.cadn.net.cn

如果调度程序需要与计划任务执行相关联,也可以自动配置调度程序(使用@EnableScheduling例如)。spring-doc.cadn.net.cn

如果启用了虚拟线程(使用 Java 21+ 和spring.threads.virtual.enabled设置为true) 这将是一个SimpleAsyncTaskScheduler使用虚拟线程。 这SimpleAsyncTaskScheduler将忽略任何与池相关的属性。spring-doc.cadn.net.cn

如果未启用虚拟线程,它将是一个ThreadPoolTaskScheduler具有合理的默认值。 这ThreadPoolTaskScheduler默认使用一个线程,可以使用spring.task.scheduling命名空间,如以下示例所示:spring-doc.cadn.net.cn

spring.task.scheduling.thread-name-prefix=scheduling-
spring.task.scheduling.pool.size=2
spring:
  task:
    scheduling:
      thread-name-prefix: "scheduling-"
      pool:
        size: 2

一个ThreadPoolTaskExecutorBuilderbean,一个SimpleAsyncTaskExecutorBuilderbean,一个ThreadPoolTaskSchedulerBuilderbean 和SimpleAsyncTaskSchedulerBuilder如果需要创建自定义执行程序或调度程序,则在上下文中可用。 这SimpleAsyncTaskExecutorBuilderSimpleAsyncTaskSchedulerBuilder如果启用了 Bean(使用 Java 21+ 和spring.threads.virtual.enabled设置为true).spring-doc.cadn.net.cn