Edited at

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

More than 1 year has passed since last update.


概要

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