任务执行和调度

在上下文中没有 Executor bean 的情况下, Spring Boot 会自动配置AsyncTaskExecutor。 启用虚拟线程(使用 Java 21+ 并设置为 )时,这将是使用虚拟线程的 SimpleAsyncTaskExecutor。 否则,它将是具有合理默认值的 ThreadPoolTaskExecutor。 在任何一种情况下,自动配置的执行程序都将自动用于:spring.threads.virtual.enabledtruespring-doc.cn

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

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

ThreadPoolTaskExecutor 被自动配置时,线程池使用 8 个核心线程,这些线程可以根据负载进行扩展和收缩。 可以使用命名空间对这些默认设置进行微调,如以下示例所示:spring.task.executionspring-doc.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.cn

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

如果启用了虚拟线程(使用 Java 21+ 并设置为 ),这将是使用虚拟线程的 SimpleAsyncTaskScheduler。 此 SimpleAsyncTaskScheduler 将忽略任何与池相关的属性。spring.threads.virtual.enabledtruespring-doc.cn

如果未启用虚拟线程,它将是具有合理默认值的 ThreadPoolTaskScheduler默认情况下,ThreadPoolTaskScheduler 使用一个线程,并且可以使用命名空间对其设置进行微调,如以下示例所示:spring.task.schedulingspring-doc.cn

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如果启用了 SimpleAsyncTaskExecutorBuilderSimpleAsyncTaskSchedulerBuilder bean(使用 Java 21+ 并设置为 ),则它们会自动配置为使用虚拟线程。spring.threads.virtual.enabledtruespring-doc.cn