Java
spring-boot

Spring Bootでtaskを定期実行する方法

概要

Spring Bootでtaskを定期的に実行する方法

環境

下記の環境で動作確認を行いました。

  • Windows7 (64bit)
  • Java 1.8.0_45
  • Spring Boot 1.2.4
  • Maven 3.3.3

参考

下記のサイトを参考にさせて頂きました。

Spring

設定

EnableSchedulingアノテーション

スケジュールを有効にするにはEnableSchedulingを使用します。

App.java
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()を実行する。

fixedDelay
@Scheduled(fixedDelay = 5000)
public void do() {
  //...
}

doSomething()の実行開始の5秒後に次のdoSomething()を実行する。

fixedRate
@Scheduled(fixedRate = 5000)
public void doSomething() {
  //...
}

spring bootの起動から60秒経過後にdoSomething()を実行する。

initialDelay
@Scheduled(initialDelay = 60000, fixedRate = 5000)
public void doSomething() {
  //...
}

毎分0秒時にdoSomething()を実行する。

cron
@Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo")
public void doSomething() {
  //...
}

実行スケジュールを設定ファイルから取得する

cronの実行スケジュールを設定ファイルに記述し、それをプログラムから参照するようにします。

下記のように設定ファイル(application.yml)に実行スケジュールを定義します。
この例ではキー名をcronとしました。(名前は任意です。)

application.yml
cron:
  cron1: 0 * * * * MON-FRI
  cron2: 0 */2 * * * *

Scheduledアノテーションのcronフィールドに、設定値をspelで記述します。

ScheduledTasks.java
@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秒時に実行.