タスクの実行とスケジューリング
コンテキスト内に 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
はデフォルトで 1 つのスレッドを使用し、次の例に示すように、その設定は 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
がコンテキストで使用可能になります。SimpleAsyncTaskExecutorBuilder
Bean および SimpleAsyncTaskSchedulerBuilder
Bean は、有効になっている場合 ( true
に設定された Java 21+ および spring.threads.virtual.enabled
を使用)、仮想スレッドを使用するように自動構成されます。