バッチ処理実装

バッチ処理で開発者が作成するポイントには以下のようなものがある。黄色の箇所が実装ポイントだ。

SpringBatch実装箇所

一部は前述「Spring Batch 基本構成」でも軽く触れているが、改めてもう一度説明しよう。

種類 メソッド 説明
ItemReader T read() Step内でInputデータを読み込むためのプロセスUnit。org.springframework.batch.item.ItemReaderを実装する。開発者が実装する以外にも、基本的なリソース(フラットファイル、XML、データベースなど)を取得するためのデフォルト実装が提供されている。
ItemProcessor O process(I item) ItemReaderで取得したInputデータを変換するためのプロセスUnit。org.springframework.batch.item.ItemProcessorを実装する。開発者が実装する以外に、Validate、入力データ結合を行うためのデフォルト実装が提供されている。
ItemWriter void write(List extends T> items) ItemProcessorからの入力データを受け取ってビジネスロジックを処理するためのプロセスUnit。org.springframework.batch.item.ItemWriterを実装する。こちらも、開発者が実装する以外に、基本的なリソース(フラットファイル、XML、データベースなど)を出力するためのデフォルト実装が提供されている。
Listener (それぞれのインタフェースで異なる) Jobの特定のタイミングに前後処理を挿入するためのリスナ。JobExecutionListener、StepExecutionListener、ItemReadListener、ItemProcessListener、ItemWriteListener などのインタフェースを実装する。

今回のサンプルでは、ItemReaderとItemWriterが実装されている。

ItemReader実装サンプル(ExampleItemWriter.java)

public class ExampleItemReader implements ItemReader<String> {
    private String[] input = {"Hello world!", null};
    private int index = 0;
    /**
     * Reads next record from input
     */
    public String read() throws Exception {
        if (index < input.length) {
            return input[index++];
        }
        else {
            return null;
        }
    }
}

サンプル実装では、読み込むInputデータを、ファイルなどから読み取るのではなく、クラス内(変数input)で持っている。

ItemWriter実装サンプル(ExampleItemWriter.java)

public class ExampleItemWriter implements ItemWriter<Object> {
    private static final Log log = LogFactory.getLog(ExampleItemWriter.class);
    /**
     * @see ItemWriter#write(Object)
     */
    public void write(List<? extends Object> data) throws Exception {
        log.info(data);
    }
}

ItemReader で読み込まれたInputデータがwriteメソッドの引数となる。このクラスではその値をログに出力している。

コンソール出力

次に、サンプルアプリケーションのコンソール出力を見てみよう。

…
[ExampleItemWriter] - <[Hello world!]>
…
[AbstractStep] - <Step execution complete: StepExecution: id=0, name=step1, status=COMPLETED, exitStatus=COMPLETED, readCount=1, filterCount=0, writeCount=1 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=2, rollbackCount=0>
…
[AbstractJob] - <Job execution complete: JobExecution: id=0, startTime=・・・, endTime=null, lastUpdated=・・・, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=0, JobParameters=[{}], Job=[job1]]>
…

[ExampleItemWriter] - <[Hello world!]> という行は、ExampleItemWriter が実行されたことを示している。

Step execution の行には、Step実行結果(StepExecution)が表示される。ItemReaderの実行回数(readCount)は1、ItemWriterの実行回数(writeCount)も1、Stepのコミット数(commitCount)が2(データ件数+STEP終了時の1)、処理はCOMPLETED(正常終了)と表示されている。

Job execution の行には、Job全体の結果(JobExecution)が表示される。Job全体の処理ステータス(status)はCOMPLETED(正常終了)、Jobの終了コード(exitStatus=exitCode)もCOMPLETED(正常終了)となっている。

また、Jobのパラメータも表示されているが、今回は指定していないので空(JobParameters=[{}])になる。