暇な日々にスパイスを

学んだ技術の備忘録

Spring Batch Hello world

Spring Batchを試していきます。

Batch処理はshellかrubyで書けば良いと思うんですが、せっかくのSpring系列にいたので試してみます。
利点としてはプロパティファイルを共有できるという点があるようです。

以下が参考元です。
Spring Batch
Spring Batch 3.0うごかす - kagamihogeの日記
1つめの公式に対して2つめの方ではラムダ式で実装しています。

プロジェクトの作成

  1. STS(Spring Tool Suite)から新規プロジェクトを作成します。
    f:id:snona:20160224212815p:plain
    今回はBatchを選択します。

バッチのジョブ作成

  1. 新規クラスを作成します。
    (@SpringBootApplicationのパッケージと同等か配下に作成してください)
  2. 2つ目のソースを写経します。 f:id:snona:20160224231535p:plain
    jobメソッドの引数を変えています。

実行

f:id:snona:20160224222527p:plain
実行すると、自動でバッチが叩かれ、Hello worldと出ています。

解説

  1. @EnableBatchProcessingを付けることで、自動でBatchのジョブと認識されます。
  2. @Configurationを付けることでComponentScanに含めます。
  3. @BeanでDIコンテナに登録していきます
  4. Jobを返すメソッドを作成します
        @Autowired
    private JobBuilderFactory jobs;

    @Bean
    public Job job(Step step1, Step step2) {
        return jobs.get("myJob").start(step1()).next(step2()).build();
    }
  1. JobBuilderFactoryのget(ジョブ名)でJob Builderを取得します。
    (なぜget何でしょうか?)
  2. JobBuilderに対してstart(最初に起動される処理)
  3. next(次に起動される処理)と続けて記述します。

登録されているstep1,step2は同じクラス内で作成します。

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    protected Step step1() {
         return stepBuilderFactory.get("step1")
        .tasklet(new Tasklet() {
          public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
            return null;
          }
        })
        .build();
    }

    @Bean
    protected Step step2() {
     ...
    }

Stepも同様に

  1. @BeanでDIコンテナに登録
  2. StepBuilderFactoryにget(処理タスク名)でStep Builderを取得します。 (なぜgetなんでしょうか)
  3. Taskletクラスにメソッドを登録します。
  4. executeのメソッド内にバッチの処理を記述します。

最終的にはREST APIを叩く、結果によってメール通知するまでバッチに仕込みたいです。
タイマーによる定期実行等もできるようです。