Springバッチタスクレットの例

Springバッチでは、 `Tasklet`は任意のステップ実行の前または後にリソースをクリーンまたはセットアップするような、単一のタスクのみを実行するために呼び出されるインタフェースです。この例では、バッチジョブの完了後に `Tasklet`を使用してリソース(フォルダ)をクリーンアップする方法を示します。

__P.S以下の `FileDeletingTasklet`の例は、http://static.springsource.org/spring-batch/trunk/spring-batch-samples/[Spring Batch samples]プロジェクトから取得しました。

1.タスクレットの例

`Tasklet`インタフェースを実装し、指定されたディレクトリ内のすべてのファイルを削除するJavaクラスです。

FileDeletingTasklet.java

package com.mkyong.tasklet;

import java.io.File;

import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
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.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;

public class FileDeletingTasklet implements Tasklet, InitializingBean {

  private Resource directory;

  @Override
  public void afterPropertiesSet() throws Exception {
    Assert.notNull(directory, "directory must be set");
  }

  @Override
  public RepeatStatus execute(StepContribution contribution,
               ChunkContext chunkContext) throws Exception {

    File dir = directory.getFile();
    Assert.state(dir.isDirectory());

    File[]files = dir.listFiles();
    for (int i = 0; i < files.length; i++) {
      boolean deleted = files[i].delete();
      if (!deleted) {
        throw new UnexpectedJobExecutionException(
                       "Could not delete file " + files[i].getPath());
      } else {
            System.out.println(files[i].getPath() + " is deleted!");
      }
    }
    return RepeatStatus.FINISHED;
  }

  public Resource getDirectory() {
    return directory;
  }

  public void setDirectory(Resource directory) {
    this.directory = directory;
  }

}

2.バッチジョブ

次の手順を実行するバッチジョブ。

spring-batch-job.xml

  <job id="readMultiFileJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="step1" next="deleteDir">
      <tasklet>
        <chunk reader="multiResourceReader" writer="flatFileItemWriter"
            commit-interval="1"/>
      </tasklet>
    </step>
    <step id="deleteDir">
        <tasklet ref="fileDeletingTasklet"/>
    </step>
  </job>

  <bean id="fileDeletingTasklet" class="com.mkyong.tasklet.FileDeletingTasklet" >
    <property name="directory" value="file:csv/inputs/"/>
  </bean>

  <bean id="multiResourceReader"
    class=" org.springframework.batch.item.file.MultiResourceItemReader">
    <property name="resources" value="file:csv/inputs/domain-** .csv"/>
    <property name="delegate" ref="flatFileItemReader"/>
  </bean>

ソースコードをダウンロードする

ダウンロードする - SpringBatch-Tasklet-Example.zip (13 KB)

前の投稿:Eclipse - java.lang.OutOfMemoryError:Javaヒープスペース
次の投稿:Spring @PropertySourceの例