任務執行與排程

在上下文中沒有 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 允許你輕鬆建立例項,這些例項能夠重現自動配置的預設行為。

如果定義了多個 Executor bean,常規任務執行會回退到名為 taskExecutor 的 bean。GraphQL、Spring MVC 和 Spring WebFlux 的支援會回退到名為 applicationTaskExecutor 的 bean。

當自動配置 ThreadPoolTaskExecutor 時,執行緒池使用 8 個核心執行緒,這些執行緒可以根據負載增長和收縮。可以使用 spring.task.execution 名稱空間來微調這些預設設定,如下例所示:

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

如果未啟用虛擬執行緒,它將是一個具有合理預設設定的 ThreadPoolTaskSchedulerThreadPoolTaskScheduler 預設使用一個執行緒,可以使用 spring.task.scheduling 名稱空間對其設定進行微調,如下例所示:

  • 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 bean。如果啟用了虛擬執行緒(使用 Java 21+ 並將 spring.threads.virtual.enabled 設定為 true),SimpleAsyncTaskExecutorBuilderSimpleAsyncTaskSchedulerBuilder bean 將被自動配置為使用虛擬執行緒。