タスクの実行とスケジューリング

コンテキストに Executor (標準 Javadoc) Bean がない場合、Spring Boot は AsyncTaskExecutor (Javadoc) を自動構成します。仮想スレッドが有効になっている場合 ( Java 21+ を使用し、spring.threads.virtual.enabled を true に設定)、これは仮想スレッドを使用する SimpleAsyncTaskExecutor (Javadoc) になります。それ以外の場合は、適切なデフォルトを持つ ThreadPoolTaskExecutor (Javadoc) になります。どちらの場合でも、自動構成されたエグゼキュータは、次の場合に自動的に使用されます。

  • 非同期タスクの実行 (@EnableAsync)

  • Spring for GraphQL のコントローラーメソッドからの Callable (標準 Javadoc) 戻り値の非同期処理

  • Spring MVC の非同期リクエスト処理

  • Spring WebFlux のブロッキング実行サポート

コンテキストでカスタム Executor (標準 Javadoc) を定義した場合、通常のタスク実行 (つまり @EnableAsync (Javadoc) ) と Spring for GraphQL の両方でそれが使用されます。ただし、Spring MVC および Spring WebFlux サポートでは、それが AsyncTaskExecutor (Javadoc) 実装 (名前は applicationTaskExecutor) である場合にのみ使用されます。ターゲットの配置に応じて、Executor (標準 Javadoc) AsyncTaskExecutor (Javadoc) に変更するか、カスタム Executor (標準 Javadoc) をラップする AsyncTaskExecutor (Javadoc) AsyncConfigurer (Javadoc) の両方を定義できます。

自動構成された ThreadPoolTaskExecutorBuilder (Javadoc) を使用すると、自動構成がデフォルトで実行する内容を再現するインスタンスを簡単に作成できます。

ThreadPoolTaskExecutor (Javadoc) が自動構成されると、スレッドプールは負荷に応じて拡大および縮小できる 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 (Javadoc) を使用)、スケジューラを自動構成することもできます。

仮想スレッドが有効になっている場合 (Java 21+ を使用し、spring.threads.virtual.enabled を true に設定)、これは仮想スレッドを使用する SimpleAsyncTaskScheduler (Javadoc) になります。この SimpleAsyncTaskScheduler (Javadoc) は、プール関連のプロパティをすべて無視します。

仮想スレッドが有効になっていない場合は、適切なデフォルトが設定された ThreadPoolTaskScheduler (Javadoc) になります。ThreadPoolTaskScheduler (Javadoc) はデフォルトで 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 (Javadoc) Bean、SimpleAsyncTaskExecutorBuilder (Javadoc) Bean、ThreadPoolTaskSchedulerBuilder (Javadoc) Bean、SimpleAsyncTaskSchedulerBuilder (Javadoc) が使用可能になります。SimpleAsyncTaskExecutorBuilder (Javadoc) および SimpleAsyncTaskSchedulerBuilder (Javadoc) Bean は、仮想スレッドが有効になっている場合 (Java 21+ および spring.threads.virtual.enabled を true に設定して使用)、仮想スレッドを使用するように自動的に構成されます。