Help us understand the problem. What is going on with this article?

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秒時に実行.
rubytomato@github
今までJavaをメインにやってきましたが、JavaScript(Node.js)の習得に取り組み始めました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした