【Spring Boot】5分でできる!定期実行処理のサンプル

【Spring Boot】 5分でできる!定期実行処理のサンプル バックエンド
スポンサーリンク

はじめに

こんにちは。みどりがめです🐢
本記事ではSpring Bootを使用した定期処理の実装についてまとめています。
つい最近、実務でバッチ処理の実装を行いました。その備忘も兼ねて、重要部分を抽出して記載しています。

この記事で分かること
  • Springを使用したスケジューリング実行の設定方法
  • スケジューリングの実装方法とよく使用するオプションについて

実装概要

本記事では、下記要件の実装完了までのプロセスを記載しています。
実装は公式ページを参考に行っています。

  • 最初の処理はアプリケーション起動1秒後に行う。
  • 以降の処理は最初の起動から5秒間隔で行う。
  • 以下の画像のように処理開始時、終了時、処理の実行回数をログに出力する。
ログ出力結果

依存関係ファイル(pom.xml)の編集

pom.xmlに以下の記述を記載します。
awaitilityは非同期システムテスト用のドメイン固有言語を提供するライブラリです。
※pom.xmlを編集したらMavenアップデートを行いましょう。

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

また、私の環境ではその他の依存関係は以下の通りです。

  • thymeleaf
  • バリデーション
  • devtools
  • Spring Web
  • jdbc
  • postgreSQL

スケジューリングを有効にする

Spring Bootでスケジューリングを有効化するためには、アプリケーションクラスに@EnableSchhedulingアノテーションを記載します。

package jp.co.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class BatchSampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(BatchSampleApplication.class, args);
	}

}

定期処理を行いたいメソッドに設定情報を付与する

定期的に処理を実行したいメソッドに@Scheduledアノテーションを記載します。注意点として、このアノテーションが指定できるのは引数を取らないメソッドのみである点です。(実行時に例外が生じます。)

また、定期処理間隔などの条件を以下のオプションにより指定できます。

  • fixedDelay…メソッドに前回実行完了時刻から何ミリ秒後に実行するか。
  • fixedRate…メソッドの前回開始時刻から何ミリ秒後に実行するか。
  • initialDelay…メソッドの初回実行時の待機時間。
  • cron…cronを記述してスケジュールを設定する。zoneを使用して平日のみの動作などの指定も可能。
package jp.co.example.controller;

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 BatchSampleController {

	private static final Logger log = LoggerFactory.getLogger(BatchSampleController.class);

	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

	int countNum = 0;

        // アプリケーション起動から1秒後に最初の処理を行い、その後5秒間隔で繰り返す。
	@Scheduled(initialDelay = 1000, fixedRate = 5000)
	public void excecute() {
		log.info("読み込み処理開始{}", dateFormat.format(new Date()));
		log.info("実行回数" + ++countNum + "回目");
		log.info("読み込み処理終了{}", dateFormat.format(new Date()));
	}

}

終わりに

本記事はここまでとなります。お疲れ様でした!
ご覧いただきありがとうございました。ご指摘等がございましたら頂けますと嬉しいです。
引き続き、プログラミングについて定期的に発信していきますのでよろしくお願いします!
また、もしよろしければtwitterもフォローしていただけると嬉しいです!🐢

コメント