任務執行與排程

在上下文中沒有 Executor bean 的情況下,Spring Boot 會自動組態 AsyncTaskExecutor。當虛擬執行緒啟用時(使用 Java 21+ 和 spring.threads.virtual.enabled 設定為 true),這將會是使用虛擬執行緒的 SimpleAsyncTaskExecutor。否則,它將會是具有合理預設值的 ThreadPoolTaskExecutor。在任何一種情況下,自動組態的執行器都將自動用於

  • 非同步任務執行 (@EnableAsync)

  • Spring for GraphQL 從控制器方法非同步處理 Callable 回傳值

  • Spring MVC 的非同步請求處理

  • Spring WebFlux 的阻塞執行支援

如果您在上下文中定義了自訂 Executor,則常規任務執行(即 @EnableAsync)和 Spring for GraphQL 都將使用它。但是,Spring MVC 和 Spring WebFlux 支援僅在它是 AsyncTaskExecutor 實作(命名為 applicationTaskExecutor)時才會使用它。根據您的目標安排,您可以將您的 Executor 變更為 AsyncTaskExecutor,或同時定義 AsyncTaskExecutor 和包裝您的自訂 ExecutorAsyncConfigurer

自動組態的 ThreadPoolTaskExecutorBuilder 允許您輕鬆建立實例,以重現預設自動組態的功能。

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 將忽略任何與池相關的屬性。

如果虛擬執行緒未啟用,則它將會是具有合理預設值的 ThreadPoolTaskSchedulerThreadPoolTaskScheduler 預設使用一個執行緒,並且可以使用 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。如果虛擬執行緒已啟用(使用 Java 21+ 和 spring.threads.virtual.enabled 設定為 true),則 SimpleAsyncTaskExecutorBuilderSimpleAsyncTaskSchedulerBuilder bean 會自動組態為使用虛擬執行緒。