Springの公式サイト、Getting Started での記述に倣って、Scheduling Taskを構築してみます。
https://spring.io/guides/gs/rest-service/
サービスを起動すると、5秒ごとに現在の時刻が表示されるというものです。

またこちらの例では、スケジューリングを多少変更し、水曜日の午後8時に起動するように設定したものです。

それではこれらのシステムを構築してみましょう。
目次
パッケージのダウンロード
Spring Initializrにて、”Artifact” 欄を “scheduling-tasks” とし、”Generate”ボタンを押してダウンロードします。
(もちろんデフォルトの”demo”のままでも、各クラスのパッケージを適切に変更できれば、問題ありません)

pom.xmlの編集
チュートリアルによると、pom.xmlの <dependency> タグに、awaitility を追加するよう指示されています。
<dependency> <groupId>org.awaitility</groupId> <artifactId>awaitility</artifactId> <version>3.1.2</version> <scope>test</scope> </dependency>
これ自体がなくても動作はしますが、テストクラスを作成し検証する際に、有用となります。
コンポーネントの作成
Scheduleを定義したコンポーネントクラスを作成します。
package com.example.schedulingtasks;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", dateFormat.format(new Date()));
}
}
@Scheduledアノテーションで fixedRate を 5000ms に定義し、5秒毎に現在時刻を表示しています。

SpringBootApplication クラスの編集
バックグラウンドでスケジューリングされたタスクを動作させるために、Spring Boot Application クラスを編集します。
package com.example.schedulingtasks;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SchedulingTasksApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulingTasksApplication.class, args);
}
}
@EnableSchedulingアノテーションは、バックグランドでのタスク実行を可能にします。
実行結果1
実行してみます。コマンドプロンプトを開き、”scheduling-tasks”をカレント・ディレクトリにしてから、次のコマンドを実行すると、冒頭の1つめの画面が得られます。
mvnw spring-boot:run

スケジュールをcron形式で設定
タスク実行のトリガを変更してみます。SchedulingTasks.java の @Scheduledアノテーションの記述を、fixedRateからcron方式に変更してみます。
package com.example.schedulingtasks;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(cron="0 55 21 * * *")
public void reportCurrentTime() {
log.info("The time is now {}", dateFormat.format(new Date()));
}
}
cronの記載方式は、”秒 分 時 日 月 曜日”。こちらの例では、毎日21時55分0秒を表しています。
実行結果2
再度実行してみます。コマンドプロンプトを開き、再び下記のコマンドを実行すると、冒頭の2つめの画面が得られます。
mvnw spring-boot:run


