Springでスケジュールされたジョブを条件付きで有効にする

1. 前書き

link:/spring-scheduled-tasks[Spring Scheduling]ライブラリにより、アプリケーションは特定の間隔でコードを実行できます。 間隔は_ @ Scheduled_アノテーションを使用して指定されるため、*間隔は通常静的であり、アプリケーションの存続期間にわたって変更することはできません*。
このチュートリアルでは、Springのスケジュールされたジョブを条件付きで有効にするさまざまな方法を見ていきます。

2. ブールフラグの使用

  • Springのスケジュールされたジョブを条件付きで有効にする最も簡単な方法は、スケジュールされたジョブ内で確認する_boolean_変数*を使用することです。 変数に_ @ Value_アノテーションを付けて、通常のSpring configuration mechanismを使用して変数を構成可能にすることができます。

@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_

別のオプションは、_ @ 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.enabled_が_true、_に設定されているか、まったく存在しない場合、ジョブが実行されます。 欠点は、この注釈がSpring Bootでのみ利用可能であることです*。

4. Springプロファイルを使用する

アプリケーションが実行されているlink:/spring-profiles[profile]に基づいて、Springのスケジュールされたジョブを条件付きで有効にすることもできます。 例として、このアプローチは、実稼働環境でのみジョブをスケジュールする必要がある場合に役立ちます。
このアプローチは、*スケジュールがすべての環境で同じであり、特定のプロファイルでのみ無効または有効にする必要がある場合に*うまく機能します*。
これは、Beanメソッドで_ @ Profile_注釈を使用することを除いて、_ @ ConditionalOnProperty_を使用するのと同様に機能します。
@Profile("prod")
@Bean
public ScheduledJob scheduledJob() {
    return new ScheduledJob();
}
これは、_prod_プロファイルがアクティブな場合にのみ*ジョブを作成します*。 さらに、_ @ Profile_アノテーションに付属するオプションの完全なセットを提供します。複数のプロファイルのマッチング、複雑なスプリング式などです。
このアプローチでは、プロファイルがまったく指定されていない場合、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のスケジュールされたジョブを条件付きで有効にする方法がいくつかあります。 一部のアプローチは他のアプローチよりも簡単ですが、制限があります。
サンプルの完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-mvc[GitHubで]で入手できます。