SpringBatchで使うJob,Step,Flow,Taskletの使い方

SpringBatchで使うJob,Step,Flow,Taskletの使い方

STSでSpringBatchプロジェクトを作成してみます。

まず、「ファイル」-「新規」-「Springプロジェクト」を選択すると以下の画面が開きます。

SpringBatchプロジェクトを作成する

テンプレートに「Simple Spring Batch Project」を選択して「次へ」を押下します。

SpringBatchプロジェクトを作成する

パッケージ名を入力して「完了」です。

サンプルを起動してみます。

プロジェクトを右クリックし、「実行」ー「実行の構成」を選択します。

SpringBatchプロジェクトを作成する

メイン・クラスに「org.springframework.batch.core.launch.support.CommandLineJobRunner」と入力します。

「引数」タブで「プログラムの引数」に「classpath:/launch-context.xml job1」と入力します。

SpringBatchプロジェクトを作成する

これで「実行」を押すと、コンソールに<[Hello world!]>と表示されます。

Spring Batchのアノテーション

Spring Batchのアノテーションです。

アノテーション 意味
@EnableBatchProcessing バッチプロセスとして認識させる
@Configuration ComponentScanの対象となる
@Bean DIされる

以下、サンプルです。

package jp.co.confrage.application;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecutionListener;
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.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class JobConfig {
  @Autowired
  private ATasklet tasklet1;
  @Autowired
  private BTasklet tasklet2;
  @Autowired
  private JobBuilderFactory jobBuilderFactory;
  @Autowired
  private StepBuilderFactory stepBuilderFactory;

  @Bean
  public Step samplestep3() {
    return stepBuilderFactory.get("step-name1")
      .tasklet(tasklet1)
      .build();
  }

  @Bean
  public Step samplestep2() {
    return stepBuilderFactory.get("step-name2")
      .tasklet(tasklet2)
      .build();
  }

  @Bean
  public Job job(@Qualifier("samplestep3") Step step1,@Qualifier("samplestep2") Step step2) {
    return jobBuilderFactory.get("job2")
      .incrementer(new RunIdIncrementer())
      .start(step1)
      .next(step2)
      .build();
  }
}

Jobでステップを実行してきます。incrementer(new RunIdIncrementer())メソッドはおまじないくらいの気持ちで、必須です。

そのあとのstartメソッドでstep1が実行されて、nextメソッドでstep2が実行されます。

@Qualifier(“引数名”)は、メソッド名を指定します。上記だとメソッド名は、samplestep3とsamplestep2になります。

なのでJobでは

public Job job(@Qualifier("samplestep3") Step step1,@Qualifier("samplestep2") Step step2)

と指定する必要があります。

jobメソッド内で、jobBuilderFactory.get(“job名”)としていますが、job名は任意です。

job内でstepを実行し、step内でtaskletを実行します。

step内のtaskletも複数指定することができますがここでは一つずつにしています。

ATaskletの例です。

package jp.co.confrage.application;

import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.stereotype.Component;

@Component
public class ATasklet implements Tasklet{
  @Override
  public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
    System.out.println("ATasklet");
    return RepeatStatus.FINISHED;
  }
}

Taskletインタフェースをimplementsする必要があります。

executeメソッドを実装する必要があるので実装します。戻り値はRepeatStatusです。

StepをFlowに纏める

Stepを直列に実行することができますが、そのステップをFlowに纏めて直列に実行することができます。

package jp.co.confrage.application;

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.job.builder.FlowBuilder;
import org.springframework.batch.core.job.flow.Flow;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class JobConfig {
  @Autowired
  private ATasklet tasklet1;
  @Autowired
  private BTasklet tasklet2;
  @Autowired
  private JobBuilderFactory jobBuilderFactory;
  @Autowired
  private StepBuilderFactory stepBuilderFactory;

  @Bean
  public Step samplestep3() {
    return stepBuilderFactory.get("step-name1")
      .tasklet(tasklet1)
      .build();
  }

  @Bean
  public Step samplestep2() {
    return stepBuilderFactory.get("step-name2")
      .tasklet(tasklet2)
      .build();
  }

  @Bean
  public Flow sampleFlow33(@Qualifier("samplestep3") Step step1, @Qualifier("samplestep2") Step step2) {
    return new FlowBuilder<Flow>("flow-name")
      .from(step1)
      .next(step2)
      .build(); // StepをFlowに纏める(step1 → step2)
  }

  @Bean
  public Job job(@Qualifier("sampleFlow33") Flow fff) {
    return jobBuilderFactory.get("job-name")
      .incrementer(new RunIdIncrementer())
      .start(fff)
      .end()
      .build(); // JobBuilderFactoryにFlowを登録する
  }
}

Jobをフローに登録する

Jobをフローに登録することも可能です。

@Bean
public Job sampleJob(JobBuilderFactory jobBuilderFactory, @Qualifier("samplestep2") Step step) {
  return jobBuilderFactory.get("job-name")
         .incrementer(new RunIdIncrementer())
         .start(step)
         .build();
}
    
@Bean
public Flow sampleFlow33(@Qualifier("sampleJob") Job sampleJob) {
  return new FlowBuilder("flow-ni-matomeru")
         .from(stepBuilderFactory.get("step-name").job(sampleJob).build())
         .build(); // jobをフローに登録する
}

コメント

タイトルとURLをコピーしました