Spring Framework:cronによるバッチの時刻起動

java

1.cronとは

Linux等のUnix系のOSには、タスク(コマンド)をスケジューリングして指定の時刻に自動実行させるためのユーティリティ「cron」が用意されています。
cronでは、crontabと呼ばれるファイルに以下のように時刻指定することで、指定した時刻にタスクを動かすことができます。

分 時 日 月 曜日 (実行したいコマンド)

具体的な記法、及び例については、以下のWikipediaの記事等を参考にしてください。
https://en.wikipedia.org/wiki/Cron

なお、Unix系のOSのcronでは、秒を指定することができません。
秒単位のスケジューリングをしたい場合は、cronから呼び出すコマンド中でsleepコマンド等を使用して制御する必要があります。

2.Spring Frameworkでのcron記法のサポート

Spring Frameworkにもスケジューリングの機能があります。
そして、@EnableSchedulingアノテーションをつけて起動するアプリケーション中で、任意のメソッドに対して@Scheduledアノテーションを用いることで、cronの記法でスケジューリングをすることもできます。

Springのcronの記法は、Unix系のOSのcronの記法と基本的には同じですが、Springのcronでは秒が指定できる点が異なります。
Springの@Scheduledアノテーションでは、以下の順番に指定します。

秒 分 時 日 月 曜日

@Scheduledアノテーションのcron記法についての詳細は、公式ドキュメントを参照してください。

3.Spring Frameworkでのcron記法のサンプルコード

以下、サンプルコードです。5秒おきに任意のメソッドを実行するサンプルです。
今回は、EclipseでSpring Boot STSを使用しています。
また、ビルドツールはGradleを使用しています。

【前準備】

Eclipseで下記操作を行い、プロジェクトを作成する。

  • ファイル→新規→その他→Spring Starter Project
  • 名前に「SpringCronTest」、グループに「com.example」、パッケージに「com.example.demo」を指定し、次へ
  • 何も選択せずに完了

【サンプルコード】

・build.gradle

plugins {
    id 'org.springframework.boot' version '2.6.1'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.10'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

・SpringCronTest.java

package com.example.demo;

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

@SpringBootApplication
@EnableScheduling
public class SpringCronTest {

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

}

・Run.java

package com.example.demo;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Run {

    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron="*/5 * * * * *")
    public void execute() {
        System.out.println("定期実行:" + sdf.format(new Date()));
    }

}

【実行方法】

SpringCronTest.javaを右クリックし、実行→Spring Boot アプリケーションを選択

【実行結果】

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.1)

2021-12-04 23:25:52.531  INFO 9696 --- [           main] com.example.demo.SpringCronTest          : Starting SpringCronTest using Java 1.8.0_162 on hama001 with PID 9696 (C:\pleiades\workspace\SpringCronTest\bin\main started by hamattyattahito001@h in C:\pleiades\workspace\SpringCronTest)
2021-12-04 23:25:52.547  INFO 9696 --- [           main] com.example.demo.SpringCronTest          : No active profile set, falling back to default profiles: default
2021-12-04 23:25:54.509  INFO 9696 --- [           main] com.example.demo.SpringCronTest          : Started SpringCronTest in 3.347 seconds (JVM running for 5.779)
定期実行:23:25:55
定期実行:23:26:00
定期実行:23:26:05
定期実行:23:26:10
定期実行:23:26:15
定期実行:23:26:20
2021-12-04 23:26:22.041  INFO 9696 --- [on(2)-127.0.0.1] inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.

4.おわりに

Spring Frameworkには、今回紹介したような便利な機能もサポートされています。
弊社の書籍やスクールでは、JavaやSpring Frameworkの基礎を身につけることで、JavaやSpring Frameworkの便利な機能を使いこなすための下地を身につけることを目指しています。

株式会社サイゼントでは、即戦力のJavaプログラマーを育てるための書籍「絶対にJavaプログラマーになりたい人へ」をKindleで販売しています。

同じく、Spring Frameworkについてきめ細かく解説した別冊も販売中です。


また、上記の書籍をテキストとして用いたプログラミングスクール「サイゼントアカデミー」も開校しています。
このスクールは、受託開発事業・SES事業である弊社が、新入社員向けの研修で培ったノウハウを詰め込んだものです。


ご興味がある方は、上記画像から個別ページにアクセスしてみてください!

コメント

タイトルとURLをコピーしました