5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Spring Batchのジョブ起動パラメータ

Posted at

spring-bootの環境でspring-batchのジョブ起動パラメータを使用する方法について。

ソースコードなど

build.gradle

build.gradle
plugins {
  id 'org.springframework.boot' version '2.2.6.RELEASE'
  id 'io.spring.dependency-management' version '1.0.9.RELEASE'
  id 'java'
}

configurations {
  developmentOnly
  runtimeClasspath {
    extendsFrom developmentOnly
  }
  compileOnly {
    extendsFrom annotationProcessor
  }
}


repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-batch'

  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
  }
  testImplementation 'org.springframework.batch:spring-batch-test'
  implementation 'com.h2database:h2'
}

test {
  useJUnitPlatform()
}

ジョブ起動パラメータの指定方法

spring-bootと共に使う場合、以下のようなコマンドライン引数として指定すれば、spring-batchのジョブ起動パラメータとして扱われる。

java -jar springbatchsample.jar hoge.param001=hoge

受け取り方

javaでジョブ起動パラメータを受け取る方法について。これはいくつかバリエーションがある。なお、readerの実装は適当なので読み飛ばしてください。

SpEL - jobParameters['hoge.param001']

SpELと@Valueを使用する方法。以下のように@Value("#{jobParameters['hoge.param001']}")とすれば、上記のコマンドラインのhoge.param001=hogeを受け取れる。

import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
@StepScope
public class MyReader implements ItemReader<Integer> {

  @Value("#{jobParameters['hoge.param001']}")
  String param001;

  @Override
  public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
    System.out.println(param001);
    
    return null;
  }

}

この方法の注意点としては@StepScopeの付与が必要。その理由については https://terasoluna-batch.github.io/guideline/5.0.0.RELEASE/ja/Ch04_JobParameter.html#Ch04_JobParameter_HowToUse_CLIArgs の「JobParametersを参照するBeanのスコープはStepスコープでなければならない」を参照。

beforeStep

リスナーである@BeforeStepを使用し、そのメソッド引数のstepExecutionからジョブ起動パラメータを取得する方法。

@Component
public class MyReader2 implements ItemReader<Integer>  {
  
  @BeforeStep
  void beforeStep(StepExecution stepExecution) {
    String param001 = stepExecution.getJobParameters().getString("hoge.param001");
    System.out.println("##" + param001);
  }

  @Override
  public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
    return null;
  }

}

上記のバリエーションとして、アノテーションではなく伝統的なStepExecutionListenerを実装する方法もある。

public class MyReader3 implements ItemReader<Integer>, StepExecutionListener  {

  @Override
  public void beforeStep(StepExecution stepExecution) {
    String param001 = stepExecution.getJobParameters().getString("hoge.param001");
    System.out.println("###" + param001);
  }
  
  @Override
  public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
    return null;
  }

  @Override
  public ExitStatus afterStep(StepExecution stepExecution) {
    return stepExecution.getExitStatus();
  }

}

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?