任務執行與排程
在上下文中沒有 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
命名空間微調這些預設設定,如下列範例所示
-
屬性
-
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
命名空間微調其設定,如下列範例所示
-
屬性
-
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
),則 SimpleAsyncTaskExecutorBuilder
和 SimpleAsyncTaskSchedulerBuilder
bean 會自動組態為使用虛擬執行緒。