技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

SpringFramework:cronによるスケジューリング

cronと言えば、Linuxに用意されているスケジュール用のプロセスを思い浮かべる方が多いと思います。
Linuxのcronについては、Wikipediahttps://en.wikipedia.org/wiki/Cron)等を参照してください)
 
しかし、cronはSpring Frameworkにも用意されています。
プロセス常駐のアプリケーション中で、アノテーションを用いて、cronの記法でスケジューリングをすることができます。
 
Springのcronの記法は、Linuxのcronの記法と基本的には同じですが、Springのcronでは秒が指定できる点が異なります。
Linuxでは「分 時 日 月 曜日」の順番に指定しますが、Springでは「秒 分 時 日 月 曜日」の順番に指定します。
秒まで指定できるため、秒単位のスケジューリングをしたい場合にLinuxのように処理中でsleepを噛ませる必要はありません。
 
Springのcronについての詳細は、公式ドキュメント(https://spring.io/blog/2020/11/10/new-in-spring-5-3-improved-cron-expressions)を参照してください。
 
以下、サンプルコードです。
今回は、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.