Springスケジューラでプロパティファイルのcron値を使用する

Aug 25 2020

SpringBootアプリケーションでSpringSchedularを使用しています。cron式をプロパティファイルとして定義しました。

batch.delete-job.cron=0 0 0 * * *

次のように、@ ScheduledAnnotationでアノテーションが付けられたメソッドでこの値を使用しています。

@Scheduled(cron = "${batch.delete-job.cron}")
public void doBatchJob() {

}

私はエラーメッセージを受け取り続けます:

無効な@Scheduledメソッド 'doBatchJob'が発生しました:cron式は6つのフィールドで構成されている必要があります( "$ {batch.delete-job.cron}"で1つ見つかりました)

アノテーションで直接cron式を使用すると、機能します。私は何が間違っているのですか?

回答

1 Anil Aug 25 2020 at 02:41

これをアプリケーションコンテキストに追加します-

public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
       return new PropertySourcesPlaceholderConfigurer();
    }

この線量が機能する場合は、両方の場所でハイフンを削除してみてください(コードとアプリケーションのプロパティで区切ります)。例:$ {batch.delete.job.cron}

user1107888 Aug 25 2020 at 19:32

プロパティ名からハイフンを削除しても違いはありませんでしたが、とにかくやりました。この問題を解決したのは、doBatchJob()メソッドを含むクラスのプロパティファイルを参照する次のアノテーションを配置することでした。実用的なソリューションは次のようになります。

@PropertySource("classpath:/config.properties")
@EnableScheduling
@Component
public class DeleteBatch {

  @Scheduled(cron = "${batch.delete.job.cron}")
  public void doBatchJob() {

  }
}
MichaelGantman Aug 25 2020 at 19:55

CRONは広く使用されている機能ですが、その欠点の1つは読みやすさが悪いことです。プログラマー以外の人がスケジューリングを定義するプロパティを設定する必要がある場合、それは困難な作業になります。次のようなものを書くことができると想像してみてください:@Scheduled(fixedRate = 9h)9時間ごとにジョブをスケジュールする(または「9h」をプロパティファイルに移動する)。さて、私はあなたがまさにそれをすることを可能にする私自身の機能を書きました。こちらの説明をご覧ください。この機能は、MgntUtisオープンソースライブラリで利用できます。ライブラリは、MavenアーティファクトまたはGitから入手できます。この機能を使用するには、アノテーションを使用するよりも少し多くのコードを記述する必要がありますが、ユーザーフレンドリーな形式を提供します。だからそれはトレードFFです