LoginSignup
1
1

More than 1 year has passed since last update.

springでバッチ処理を簡単に実装してみる

Posted at

今日も備忘録です。

このドキュメントについて

下記3点について記載していきます。
・springの@Scheduledを利用したバッチ処理
・cronの利用方法
@Scheduled利用時の注意点

実行環境

・Java17
・springboot 3.0.2

実装

    final static LocalDateTime now = LocalDateTime.now();

    @Scheduled(fixedDelay = 2000)
    public void fixedDelay() {
        log.info(String.valueOf(ChronoUnit.MILLIS.between(now, LocalDateTime.now())));
    }

①:fixedDelay
処理の実行完了時点から一定の間隔で実行される。
上記を例にすると、処理が終わって2秒後にfixedDelayが実行される。

処理を一定の間隔にしたいなら、fixedDelayを利用するべき。
(処理の実行が被らないようにする)

    final static LocalDateTime now = LocalDateTime.now();

    @Scheduled(fixedRate = 2, timeUnit = TimeUnit.SECONDS)
    public void fixedRate() {
        log.info(String.valueOf(ChronoUnit.MILLIS.between(now, LocalDateTime.now())));
    }

②:fixedRate
処理の実行開始時点から一定の間隔で実行される。
上記を例にすると、処理が開始された2秒後にfixedRateが実行される。

補足:
timeUnit = TimeUnit.SECONDS で単位を指定できる。
デフォルトはms。


    final static LocalDateTime now = LocalDateTime.now();

    @Scheduled(initialDelay = 3000, fixedRate = 2000)
    public void initialDelay() {
        log.info(String.valueOf(ChronoUnit.MILLIS.between(now, LocalDateTime.now())));
    }

③:initialDelay
処理の初期遅延を指定できる。
上記を例にすると、アプリケーション起動後3秒の初期遅延があり、その後2秒間隔でinitialDelayメソッドが実行される。

    @Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo" )
    public void cron() {
        log.info(String.valueOf(LocalDateTime.now()));
    }

④:cron
秒、分、時間、日、月、曜日などを指定し、処理を定期実行する。
上記を例にすると、毎分0秒にcron()が実行される。

zoneはどこの地域の時間を軸にするのか。

cronの設定について

秒、分、時、日、月、曜日の順で設定ができる。
月とか曜日は、英語3文字でも設定できるらしい。
例) 月曜日 = Mon、 4月 = Apr

cron 内容
0 * * * * * 毎分0秒に実行
0 30 * * * * 毎時30分0秒に実行
0 0 12 * * * 毎日12時0分0秒に実行
0 0 12 */3 * * 毎月3の倍数の日の12時0分0秒に実行
0 0 12 1 *3 * 3の倍数がつく月の1日12時0分0秒に実行
0 0 12 * * 1-5 月曜日から金曜日の12時0分0秒に実行

実装時の注意点

以下3つの実装時の注意点を守らないと、定期実行されなかったり、アプリケーション起動時にエラーが起こるので必ず抑えておく。

①:Application起動クラスに@EnableSchedulingを付与する必要がある。

@ConfigurationPropertiesScan
@SpringBootApplication
@EnableScheduling
public class DemoApplication {

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

}

②:@Scheduledで定期実行させるには、クラスを@Component等でDIコンテナに登録する必要がある。

@Slf4j
@Component
public class TestBatch {

    final static LocalDateTime now = LocalDateTime.now();

    @Scheduled(fixedDelay = 2000)
    public void fixedDelay() {
        log.info(String.valueOf(ChronoUnit.MILLIS.between(now, LocalDateTime.now())));
    }

③:@Scheduledを付与するメソッドはvoidかつ引数がないものにする必要がある

まとめ

本来バッチは、シェルスクリプトを用意してcronを設定する必要がありますが、springの@Scheduledを利用すれば簡単にバッチ実行できるので、すごく便利だなと思いました。

実務で使う機会があれば使っていきたいなと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1