サンプル拡張

上記のサンプルでSpringBatchの仕組みと動きの簡単なところがつかめただろうか。

今度はもう少し実践に近い動作を加えてサンプルを拡張してみよう。具体的には、以下のような拡張を行ってみる。

  • バッチ処理のInputデータを外部リソース(CSVファイル)から読み取るように変更する。
  • バッチ引数で「日付」を指定し、Inputデータのうち対象外日付のレコードは処理をスキップさせる。

外部リソース(CSVファイル)をInputデータにする

InputデータとしてCSVファイルを読み込むように変更してみよう。step2Input.csvという名前のファイルを用意した。カラムはそれぞれ、ID,bizDate,username としている。レコード数は5件だ。

001,2010-04-01,user1
002,2010-04-02,user2
003,2010-04-03,user3
004,2010-04-04,user4
005,2010-04-05,user5

Spring Batchでは、ItemReaderの実装クラスとして、フラットファイル、XML、データベースといった外部リソースを読み込むクラスが提供されている。今回はフラットファイル用「FlatFileItemReader」を使用して、CSVを読み込んでみたい。FlatFileItemReaderのBean定義は以下のようになる。

<bean id="step2FileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"  scope="step">
<property name="resource" value="classpath:#{jobParameters['file']}" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="ID,bizDate,userName " />
</bean>
</property>
<property name="fieldSetMapper">
<bean class="example.Step2InputEntityFieldSetMapper" />
</property>
</bean>
</property>
</bean>

FlatFileItemReaderの属性を説明しよう。

resource 読み込むファイルパスを指定する。今回は、ファイル名(step2Input.csv)をJob引数で(file= step2Input.csv)指定させるようにする。Job引数を指定するには、「#{jobParameters['引数名']}」と記述する。
lineMapper ファイルのデータをBeanにマッピングするためのクラスを指定する。今回は、SpringBatchで提供されているDefaultLineMapperを利用している。DefaultLineMapperでは、ファイルの解析クラス(DelimitedLineTokenizer)とMapperクラス(Step2InputEntityFieldSetMapper)を指定する必要がある。names 属性にCSVのカラム名を指定する。DelimitedLineTokenizerはSpringBatch提供クラスで、CSVのカラム名を定義する。なお、Mapperクラス(Step2InputEntityFieldSetMapper)についてはこの後で説明する。

FlatFileItemReader を利用するために、CSVデータを保持するEntityクラス(Step2InputEntity)と、そのMapperクラス(Step2InputEntityFieldSetMapper)を実装する必要がある。 Step2InputEntityはCSVのカラム(ID,bizDate,userName)を保持する単純なBeanクラスなので、ソースは省略する。

MapperクラスはSpringのFieldSetMapperインタフェースを実装して作成する。

public class Step2InputEntityFieldSetMapper implements FieldSetMapper<Step2InputEntity> {
    public Step2InputEntity mapFieldSet(FieldSet arg0) throws BindException {
        if(arg0 == null){
            return null;
        }
        Step2InputEntity entity = new Step2InputEntity();
        entity.setId(arg0.readString("ID"));
        entity.setBizDate(arg0.readDate("bizDate"));
        entity.setUserName(arg0.readString("userName"));
        entity.setResult(arg0.readString("result"));
        return entity;
    }
}

このあと、step2FileItemReaderのBean IDを Job設定のItemReader(属性:read)に指定すれば完了だ。