SpringでScheduling Taskを構築

投稿者: | 2020年2月10日

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