Spring Bootチュートリアル　タスクのスケジュール

Spring bootの公式チュートリアル([タスクのスケジュール](https://spring.io/guides/gs/scheduling-tasks/))を参考に、タスクを定期実行するプログラムを作成しました。

##環境
Apache Maven 3.6.3
OS： macOS Mojave バージョン10.14.6
テキストエディタ： VSCode
Java: 11.0.2

##作成

まず、[Spring Initializr](https://start.spring.io/)を開き、以下の内容で土台を作成します。

<img width="965" alt="スクリーンショット 2020-07-14 10.56.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367972/20133d58-bd58-9dcc-8d1d-b4ece24cc988.png">

出来上がったzipファイルを解凍し、エディターで開きます。

pom.xmlに、以下の依存関係を追加します。

```
<dependency>
  <groupId>org.awaitility</groupId>
  <artifactId>awaitility</artifactId>
  <version>3.1.2</version>
  <scope>test</scope>
</dependency>
```

Awaitilityは、*非同期システムテスト用のシンプルなドメイン固有言語（DSL）を提供するライブラリ*です。（[Introduction to Awaitility](baeldung.com/awaitlity-testing)より）

src/main/java/com/example/schedulingtasks下に、ScheduledTasks.javaファイルを作成します。

内容は以下のとおりです。

```ScheduledTasks.java
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()));
	}
}
```

fixedRateは、各呼び出しの開始時刻から測定された、メソッド呼び出しの間隔を指定します。他にも、fixedDeleyといった、タスクの完了から呼び出しの間隔を指定するなどのオプションがあります。

@Scheduled
タスクを定期実行します。オプションをいろいろ選べます（下の表）。
定期実行したいtaskに実行周期をScheduledアノテーションで指定します。
このアノテーションが指定できるのは引数を取らないメソッドだけです。（コンパイルエラーにはなりませんが実行時に例外が発生します。）

今回はfixedRateで5秒おきにタスクを実行することにします。

| field |description |
|:-----------------|:-----------------|
| fixedDelay  |メソッドの前回の実行完了時刻から何ミリ秒後に実行するか。 |
| fixedRate |メソッドの前回の実行開始時刻から何ミリ秒後に実行するか。|
|initialDelay|メソッドの初回実行時の待機時間。|
| cron |cronを記述してスケジュールを設定。zoneを使用して時間帯の指定も可能。 |
(cron="・・・")を使うとより高度な設定もできます。

LoggerとLoggerFactoryはconsoleに結果を出力するためのものです。
LoggerFactory.getLogger()の引数にクラスを指定するとログを表示できます。

次に、src/main/java/com/example/schedulingtasks/下に自動で作られたSchedulingTasksApplication.javaファイルにコードを追加します。

内容は以下のとおりです。

```SchedulingTasksApplication.java
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);
	}
}
```
**@SpringBootApplication**
これ1つで3つ分のアノテーションの働きをしてくれる便利なアノテーションです。以下の3つのアノテーションを含んでいます。

>**@Configuration**
コンテキストに追加の Bean を登録したり、追加の構成クラスをインポートしたりできます。

>>**@Bean**
@Beanを記述したメソッドでインスタンス化したクラスを返すためのものです。

>**@EnableAutoConfiguration**
Spring Bootの自動構成メカニズムを有効にします。

>**@ComponentScan**
パッケージ内の他のコンポーネントや設定等を探し、コントローラを見つけるようにSpringに指示します。

@EnableScheduling
スケジュールを有効にします。


##実行する
以上でコードは完成しました。
さっそく以下のコマンドで実行してみます。

```
./mvnw spring-boot:run
```

5秒毎にタスクが実行されています。
<img width="848" alt="スクリーンショット 2020-07-14 10.32.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367972/f8e1bce1-fe09-1e6b-6db8-daecbfc04be6.png">

依存関係も特に追加することなく、簡単に作ることができました！