Java
spring-batch
SpringBoot

ItemReaderでJobParameterをコンストラクタの引数として受け取る方法

More than 1 year has passed since last update.

はじめに

Spring BootとSpring Batchを使うとバッチ処理の面倒くさい部分がかなり簡素化されるので便利ですね。公式ドキュメントを参照すれば特に問題なく実装できるようになっているので、なにかうまく行かなければドキュメント読めやゴルアと叱られること必至です。

とはいえ、行き詰まることもあるのが人生ですし、今回のそれはJobParameterでした。

JobParameterを参照する

Tasklet

taskletではexecute(StepContribution, ChunkContext)が呼び出されます。

JobParameterを参照するには以下の手順を踏みます。

  1. ChunkContext#getStepContextでStepContextを取得
  2. StepContext#getJobParametersでJobParameterを取得

Chunk

Chunk処理、例えばItemReaderで参照する場合は以下の手順を踏みます。

  1. @Configurationアノテーションを付与したクラスの中でItemReaderを取得するメソッドに@StepScopeアノテーションを付ける
  2. @ValueアノテーションでJobParameterのキーを指定する
  3. Stepの構築時は引数にnullを渡しておく
@Configuration
public class BatchConfig {

  @Bean
  @StepScope
  public ItemReader<Hoge> itemReader(@Value("#{jobParameters['foo']}") String foo) {
    return new ItemReader(foo);
  }


  @Bean
  public Step step1() {
    return stepBuilderFactory.get("step1")
            .<Hoge, Fuga>chunk(1000)
            .reader(itemReader(null))
            .processor(processor())
            .writer(writer())
            .build();
  }
}

まとめという名の…

引数にnull渡せばいいんだよというところがどうもスッキリしない感満載なのですが、まあそうしかないわなあとも思えるので飲み込んだ次第です。

追記

@making@github さんにご指摘いただいた方法でうまくいきました。nullを渡さなくて良いのでスッキリですね。

@Configuration
public class BatchConfig {

  @Autowired
  HogeItemReader hogeItemReader;

  @Bean
  @StepScope
  public ItemReader<Hoge> itemReader(@Value("#{jobParameters['foo']}") String foo) {
    return new ItemReader(foo);
  }

  @Bean
  public Step step1() {
    return stepBuilderFactory.get("step1")
            .<Hoge, Fuga>chunk(1000)
            .reader(hogeItemReader)
            .processor(processor())
            .writer(writer())
            .build();
  }
}


public class HogeItemReader extends ... {

  public HogeItemReader(String foo) {
    System.out.println(foo);
  }

}

以上。