SpringBoot(kotlin)で手軽なバッチ処理を実装する

はじめに

SpringBootを使って手軽にバッチ処理のようなものを作ったのでメモがてら書きます。 SpringBootではSpringBatchという形で実装する手段があるかと思いますが 手軽な環境を構築したい場合を想定したものになります。

実装したもの

以下の構成で実装しました。

要素 version
SpringBoot 2.4.5
jvm 11

※言語はKotlinを使います。

環境はmac os上でIntelliJ IDEA上で動作させています。

実装内容

主に実装手順になります。

雛形作成

Spring initializrを使って生成します。 https://start.spring.io/

GroupやArtifactなどは適当なものを設定しています。 入力は以下の感じになります。 f:id:set21set21:20210421211643p:plain

これでGENERATEを押します。 すると雛形がダウンロードされるので任意の場所に配置します。

読み込み

ここからintelij ideaを使ってプロジェクトを作成します。 さきほどダウンロードした雛形ファイルを読み込むことでプロジェクトを作成します。

実装開始

動作イメージ

最終的には起動引数を設定するとアプリケーションが起動し処理が行われることがゴールになります。 これを目指します。

以下のコマンドを実行することで動作させることになります。

java -Dbatch.execute=test01 -jar light-0.0.1-SNAPSHOT.jar

処理の受け口を作る

良く作られるものはAPIだったり、Web画面用のControllerだったりすると思うのですがここでは 軽量なバッチをイメージしているものなので、起動方法がちょっと異なります。

ApplicationRunnerの実装

以下のようにApplicationRunnerを実装したクラスを作成します。 ここでは引数に渡された値によって処理が分かれるイメージを想定するので2つ作成します。

package com.hiswing.lightweight

import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

class LightWeight01Runner : ApplicationRunner {
    override fun run(args: ApplicationArguments?) {
        println("lightweight01 start")
    }
}

@Configuration
class LightWeight01Config {
    @Bean
    @ConditionalOnProperty(value = ["batch.execute"], havingValue = "test01")
    fun execute(): LightWeight01Runner? {
        return LightWeight01Runner()
    }
}

2つめ

package com.hiswing.lightweight

import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

class LightWeight02Runner : ApplicationRunner {
    override fun run(args: ApplicationArguments?) {
        println("lightweight02 start")
    }
}

@Configuration
class LightWeight02Config {
    @Bean
    @ConditionalOnProperty(value = ["batch.execute"], havingValue = "test02")
    fun execute(): LightWeight02Runner? {
        return LightWeight02Runner()
    }
}

起動確認

IntelliJ IDEAで動作確認

準備

引数で起動するクラスを制御しているのでその引数を設定する必要があります。 ここでは以下のようにしました。 f:id:set21set21:20210422204545p:plain

起動確認

lightweight02 startが出力されているのを確認できました。 f:id:set21set21:20210422204622p:plain

コマンドラインで起動確認

IntelliJ IDEAではなく、生成されたjarをコマンドで実行できることを確認します。

java -Dbatch.execute=test01 -jar build/libs/lightweight-0.0.1-SNAPSHOT.jar

以下、実行結果です。今度は、lightweight01 startと出力されているので、引数によって起動する処理が変わっているのが わかりました。 f:id:set21set21:20210422205122p:plain

まとめ

比較的簡単にバッチのようなものの実装ができました。 軽量な処理をさっと書きたいときは便利だと思います!

実装したソースコードはこちらにあります。 github.com

参考サイト

今回の実装の参考としてこちらを参照しました。 qiita.com qiita.com SpringBatchはこちらのバッチ解説PDFを参照したい www.shoeisha.co.jp