Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

SpringBoot 処理を定期実行する方法(スケジューリング)

Spring Boot のスケジューリング機能を使って、処理を定期的に実行する方法を書いていきます。

目次

  1. 起動クラスの作成
  2. fixedRateのタスクを作成
  3. cronのタスクを作成
  4. ビルドファイルの作成
  5. 動作確認

バージョン

動作確認で使用した製品のバージョンは以下の通りです。

1. 起動クラスの作成

以下のアプリ起動クラスを作成します。

src/main/java/org/example/SpringApp.java

package org.example;

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

@EnableScheduling
@SpringBootApplication
public class SpringApp {
  public static void main(String[] args) {
    SpringApplication.run(SpringApp.class, args);
  }
}

アノテーション @EnableScheduling を付けて、スケジューリング機能を有効にします。

2. fixedRateのタスクを作成

アノテーション @Scheduled(fixedRate=ミリ秒) を使うと、メソッドが一定間隔で実行されます。

src/main/java/org/example/schedule/FixedRateTask.java

package org.example.schedule;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

@Component
public class FixedRateTask {
  private DateTimeFormatter fmt
    = DateTimeFormatter.ofPattern("HH:mm:ss");

  // 5秒毎に実行
  @Scheduled(fixedRate=5000)
  public void reportTime() {
    System.out.print("fixedRate=");
    System.out.println(
      LocalDateTime.now().format(fmt)
    );
  }
}

アノテーション @Component を付けて、Spring にオブジェクトを管理してもらいます。

3. cronのタスクを作成

アノテーション @Scheduled(cron="定義") を使うと、cronのように実行することができます。

src/main/java/org/example/schedule/CronTask.java

package org.example.schedule;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

@Component
public class CronTask {
  private DateTimeFormatter fmt
    = DateTimeFormatter.ofPattern("HH:mm:ss");

  // 0秒時に実行(1分毎)
  @Scheduled(cron="0 * * * * *")
  public void reportTime() {
    System.out.print("cron=");
    System.out.println(
      LocalDateTime.now().format(fmt)
    );
  }
}

定義するフィールドは6つで、左から右に以下の通りです。

  1. 曜日

値の詳細は、Spring の JavaDoc に記載されています。

CronExpression - docs.spring.io

4. ビルドファイルの作成

Mavenのビルドファイルは以下の通りです。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.2</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>org.example</groupId>
  <artifactId>spring-schedule</artifactId>
  <version>1.0.0</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>17</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

5. 動作確認

アプリ起動クラスを実行すると、指定した間隔で時刻が表示されます。

fixedRate=01:04:59
cron=01:05:00
fixedRate=01:05:04
fixedRate=01:05:09
...