概要
Spring Bootでtaskを定期的に実行する方法
環境
下記の環境で動作確認を行いました。
- Windows7 (64bit)
- Java 1.8.0_45
- Spring Boot 1.2.4
- Maven 3.3.3
参考
下記のサイトを参考にさせて頂きました。
Spring
- [GETTING STARTED - Scheduling Tasks] (http://spring.io/guides/gs/scheduling-tasks/)
設定
EnableSchedulingアノテーション
スケジュールを有効にするにはEnableSchedulingを使用します。
package com.example.actor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
Scheduledアノテーション
定期実行したいtaskに実行周期をScheduledアノテーションで指定します。
このアノテーションが指定できるのは引数を取らないメソッドだけです。(コンパイルエラーにはなりませんが実行時に例外が発生します。)
field | description |
---|---|
fixedDelay | taskの実行完了時点から指定時間後に次のtaskを実行する. 単位はms. |
fixedRate | taskの実行開始時点から指定時間後に次のtaskを実行する. 単位はms. |
initialDelay | 指定時間後に最初のtaskを開始する. 単位はms. fixedDelay又はfixedRateと組み合わせて使用する. |
cron | cronで指定した周期でtaskを実行する. |
zone | cronの起動時間のタイムゾーンを指定する. 未指定時はデフォルトのtimezoneを使用する. |
do()の実行完了の5秒後に次のdo()を実行する。
@Scheduled(fixedDelay = 5000)
public void do() {
//...
}
doSomething()の実行開始の5秒後に次のdoSomething()を実行する。
@Scheduled(fixedRate = 5000)
public void doSomething() {
//...
}
spring bootの起動から60秒経過後にdoSomething()を実行する。
@Scheduled(initialDelay = 60000, fixedRate = 5000)
public void doSomething() {
//...
}
毎分0秒時にdoSomething()を実行する。
@Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo")
public void doSomething() {
//...
}
実行スケジュールを設定ファイルから取得する
cronの実行スケジュールを設定ファイルに記述し、それをプログラムから参照するようにします。
下記のように設定ファイル(application.yml)に実行スケジュールを定義します。
この例ではキー名をcron
としました。(名前は任意です。)
cron:
cron1: 0 * * * * MON-FRI
cron2: 0 */2 * * * *
Scheduledアノテーションのcronフィールドに、設定値をspelで記述します。
@Component
public class ScheduledTasks {
@Scheduled(cron = "${cron.cron1}")
public void doSomething() {
//...
}
}
cronメモ
左から秒(0-59)、分(0-59)、時(0-23)、日(1-31)、月(1-12)、曜日(0:日,1:月,2:火,3:水,4:木,5:金,6:土,7:日)を設定する。月、曜日は英語で3文字の短縮形が使用できる。
例
cron | description |
---|---|
0 0 * * * * |
毎時、0分0秒時に実行. |
0 0 0 * * * |
毎日、0時0分0秒に実行. |
0 0 0 1 * * |
毎月、1日0時0分0秒に実行. |
0 0 12 */5 * * |
毎月、5の倍数の日の12時0分0秒に実行. |
0 0 9-18 * * 1-5 |
月から金曜日の9時から18時の0分0秒時に実行. |