https://qiita.com/kazuki43zoo/items/47ed3b15077773f02448
上記記事を参考にさせていただきました
SpringBootで何らかのバッチ処理を作る際に高機能でジョブを制御する仕組みがあるSpringBatchを使いたくないようなケースがあります(例えばジョブスケジューラーなどを利用していてジョブは実行するだけにしたい場合など)。その場合はJavaコマンド実行してリターンコードで結果を返すようなシンプルな構造にしたい。
やりたいこと
・SpringBootでコマンド実行して指定した処理を動かす
・機能ごとにクラスを分けてどの機能を動かすか?は引数で指定する
・ジョブの成功/失敗はコマンド実行のリターンコードで判断する
構成
実行コマンドイメージ
java exec:<実行したいクラス名> -jar filename.jar
コマンド実行した際の最初にコールするクラス
package com.example.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
System.exit(SpringApplication.exit(SpringApplication.run(SpringBootTestBatchApplication.class, args)));
}
}
mainから呼び出すクラス
package com.example.springboot;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.springframework.boot.ExitCodeGenerator;
@Component
public class SpringBootTestBatchApplication implements ApplicationRunner, ExitCodeGenerator {
private int exitCode = 0;
@Override
public void run(ApplicationArguments args) {
String execFuncion = "";
for(String value : args.getNonOptionArgs()) {
if(value.startsWith("exec:")) execFuncion = value.substring(4);
}
// 実行するクラスの処理
return;
}
@Override
public int getExitCode() {
return exitCode;
}
}
設定
spring.main.banner-mode=off
spring.main.web-application-type=none
引数を読み取り、その入力によって実行するクラスを決めます。実行結果を整数で受け取りリターンコードに入れ込みます。
VScodeにおける引数の指定方法
以下のように「構成の追加」からlunch.jsonを編集可能です
argsという項目に引数に指定したい文字列を設定すれば、以降VScode上で実行時に引数付きで実行できます
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Launch Application",
"request": "launch",
"mainClass": "com.example.springboot.Application",
"projectName": "spring-boot-test",
"args": "exec:Testfunc"
}
]
}
上記のように指定した場合は以下のようなコマンド実行となります
java exec:Testfunc -jar SpringBoot.jar