SpringBatchのbeforeStep処理

SpringBatchのbeforeStep処理

Spring BatchのbeforeStepメソッドは、StepExecutionの実行前にカスタムロジックを挿入するために使用されます。
このメソッドは、StepExecutionListenerインターフェースの一部として定義されており、ステップの開始前に特定の処理を実行する必要がある場合に便利です。

以下に、beforeStepメソッドを使用する基本的な流れとコード例を示します。

StepExecutionListener インターフェース

StepExecutionListenerは、ステップの開始と終了時に呼び出されるメソッドを提供するインターフェースです。
主に次の2つのメソッドがあります。

  • beforeStep(StepExecution stepExecution): ステップの実行前に呼び出される。
  • afterStep(StepExecution stepExecution): ステップの実行後に呼び出される。

beforeStep メソッドの使用例

beforeStepメソッドを使用して、ステップの実行前に何らかの準備作業を行う例を示します。

import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.stereotype.Component;

@Component
public class CustomStepExecutionListener implements StepExecutionListener {

  @Override
  public void beforeStep(StepExecution stepExecution) {
    // ステップ実行前の処理をここに記述します
    System.out.println("ステップが開始される前の処理");

    // 必要に応じてステップのパラメータを取得する
    String jobParameter = (String) stepExecution.getJobParameters().getParameters().get("exampleParam").getValue();
    System.out.println("ジョブパラメータ: " + jobParameter);

    // 例: 特定の条件に基づいてステップをスキップするなど
    if (jobParameter.equals("skip")) {
      System.out.println("ステップをスキップします");
      return null;  // nullを返すとステップの実行をスキップします
    }

    return ExitStatus.COMPLETED;  // ステップの実行を続行します
  }

  @Override
  public ExitStatus afterStep(StepExecution stepExecution) {
    // ステップ実行後の処理をここに記述します
    System.out.println("ステップが終了した後の処理");
    return ExitStatus.COMPLETED;
  }
}

StepExecutionListenerの設定

このカスタムリスナーをバッチジョブに設定するには、ジョブ設定の中でリスナーを指定します。
以下は、Spring Batchのジョブ設定の一部です。

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

  @Autowired
  private JobBuilderFactory jobBuilderFactory;

  @Autowired
  private StepBuilderFactory stepBuilderFactory;

  @Autowired
  private CustomStepExecutionListener customStepExecutionListener;

  @Bean
  public Job exampleJob() {
    return jobBuilderFactory.get("exampleJob")
      .start(exampleStep())
      .build();
  }

  @Bean
  public Step exampleStep() {
    return stepBuilderFactory.get("exampleStep")
      .tasklet(exampleTasklet())
      .listener(customStepExecutionListener)
      .build();
  }

  @Bean
  public Tasklet exampleTasklet() {
    return (contribution, chunkContext) -> {
      System.out.println("タスクレットの処理");
      return RepeatStatus.FINISHED;
    };
  }
}

まとめ

beforeStepメソッドは、ステップの実行前に必要な準備や条件チェックを行うための便利な方法です。
StepExecutionListenerを実装して、ジョブの実行前に必要なロジックを追加することで、バッチジョブの柔軟性と制御を向上させることができます。