任務執行與排程
在上下文中沒有 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
名稱空間來微調這些預設設定,如下例所示:
-
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
將忽略任何與池化相關的屬性。
如果未啟用虛擬執行緒,它將是一個具有合理預設設定的 ThreadPoolTaskScheduler
。 ThreadPoolTaskScheduler
預設使用一個執行緒,可以使用 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
),SimpleAsyncTaskExecutorBuilder
和 SimpleAsyncTaskSchedulerBuilder
bean 將被自動配置為使用虛擬執行緒。