今日も備忘録です。
このドキュメントについて
下記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を利用すれば簡単にバッチ実行できるので、すごく便利だなと思いました。
実務で使う機会があれば使っていきたいなと思います。