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

コンテキスト内に 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 に変更することも、カスタム Executor をラップする AsyncTaskExecutor と AsyncConfigurer の両方を定義することもできます。

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

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 を使用)、仮想スレッドを使用するように自動構成されます。