1. 序章

Spring Scheduling ライブラリを使用すると、アプリケーションは特定の間隔でコードを実行できます。 間隔は@Scheduledアノテーションを使用して指定されるため、間隔は通常静的であり、アプリケーションの存続期間にわたって変更することはできません

このチュートリアルでは、Springスケジュールされたジョブを条件付きで有効にするさまざまな方法を見ていきます。

2. ブールフラグの使用

Springのスケジュールされたジョブを条件付きで有効にする最も簡単な方法は、スケジュールされたジョブ内でチェックするブール変数を使用することです。 変数に@Valueの注釈を付けて、通常のSpring構成メカニズムを使用して構成できるようにすることができます。

@Configuration
@EnableScheduling
public class ScheduledJobs {
  @Value("${jobs.enabled:true}")
  private boolean isEnabled;

  @Scheduled(fixedDelay = 60000)
  public void cleanTempDirectory() {
    if(isEnabled) {
      // do work here
    }
  }
}

欠点は、スケジュールされたジョブが常にSpring によって実行されることです。これは、場合によっては理想的ではない可能性があります。

3. @ConditionalOnPropertyを使用する

もう1つのオプションは、@ConditionalOnPropertyアノテーションを使用することです。 Springプロパティ名を取り、プロパティがtrueと評価された場合にのみ実行されます。

まず、スケジュール間隔を含む、スケジュールされたジョブコードをカプセル化する新しいクラスを作成します。

public class ScheduledJob {
    @Scheduled(fixedDelay = 60000)
    public void cleanTempDir() {
        // do work here
  }
}

次に、そのタイプのBeanを条件付きで作成します。

@Configuration
@EnableScheduling
public class ScheduledJobs {
    @Bean
    @ConditionalOnProperty(value = "jobs.enabled", matchIfMissing = true, havingValue = "true")
    public ScheduledJob scheduledJob() {
        return new ScheduledJob();
    }
}

この場合、プロパティ jobs.enabledtrue、に設定されているか、まったく存在しない場合に、ジョブが実行されます。 欠点は、このアノテーションがSpringBootでのみ使用できることです。

4. Springプロファイルの使用

また、アプリケーションが実行されているプロファイルに基づいて、Springスケジュール済みジョブを条件付きで有効にすることもできます。 例として、このアプローチは、ジョブを実稼働環境でのみスケジュールする必要がある場合に役立ちます。

このアプローチは、スケジュールがすべての環境で同じであり、特定のプロファイルでのみ無効または有効にする必要がある場合にうまく機能します

これは、Beanメソッドで @Profile アノテーションを使用することを除いて、@ConditionalOnPropertyを使用する場合と同様に機能します。

@Profile("prod")
@Bean
public ScheduledJob scheduledJob() {
    return new ScheduledJob();
}

これにより、prodプロファイルがアクティブな場合にのみジョブが作成されます。 さらに、 @Profile アノテーションに付属するオプションの完全なセットを提供します。複数のプロファイルのマッチング、複雑なばね式などです。

このアプローチで注意すべきことの1つは、プロファイルがまったく指定されていない場合beanメソッドが実行されることです

5. cron式の値プレースホルダー

Spring値プレースホルダーを使用すると、条件付きでジョブを有効にするだけでなく、スケジュールを変更することもできます。

@Scheduled(cron = "${jobs.cronSchedule:-}")
public void cleanTempDirectory() {
    // do work here
}

この例では、ジョブはデフォルトで無効になっています(特別なSpring cron disable式を使用)。

ジョブを有効にする場合は、 jobs.cronSchedule。に有効なcron式を指定するだけです。これは、他のSpring構成と同じように実行できます:コマンドライン引数、環境変数、プロパティファイルなど。

cron式とは異なり、ジョブを無効にする固定遅延または固定レート値を設定する方法はありません。 したがって、このアプローチはcronスケジュールジョブでのみ機能します。

6. 結論

このチュートリアルでは、Springスケジュールされたジョブを条件付きで有効にするいくつかの異なる方法があることを確認しました。 一部のアプローチは他のアプローチよりも単純ですが、制限がある場合があります。

例の完全なソースコードは、GitHubから入手できます。