cronと言えば、Linuxに用意されているスケジュール用のプロセスを思い浮かべる方が多いと思います。
(Linuxのcronについては、Wikipedia(https://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.