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