バッチ引数で「日付」を指定し、Inputデータのうち対象外日付のレコードは処理をスキップさせる

ここでは、以下の作業をする。

  • バッチ処理の引数で基準日付を指定できるようにする(bizDate(date)=YYYY/MM/DD)。引数名はbizDateだ。(date)という記述を加えることで、値をDate型にマッピングすることができる。
  • Inputデータの日付と引数の日付を比較し、引数日付より後のデータはスキップするようにする。

この実装は ItemProcessorを使って実装してみよう。

public class ExampleItemProcessor implements ItemProcessor<Step2InputEntity, Step2InputEntity> {
    private Date bizDate;
    public void setBizDate(Date bizDate) {
        this.bizDate = bizDate;
    }
    public Step2InputEntity process(Step2InputEntity arg0) throws Exception {
        if(bizDate.before(arg0.getBizDate())){
            // throw Exception for Skip
            throw new ExampleSkipException("input date is old.");
        }
        return arg0;
    }
}

ItemProcessorは、ItemReaderで読み込んだデータを変換する際に用いるUnitだ。

まず、引数のbizDateを受け取るためのFieldとsetterメソッドを用意しよう。引数で(date)と明示した通り、Date型としている。

次に、ItemProcessorのメソッド 「O process(I item)」を実装しよう。引数及び戻り値は、ItemReaderでCSVデータを保管するEntityにした「Step2InputEntity」を使用する。

processメソッドの中で、Step2InputEntity(Inputデータ)の日付が引数の日付以降であった場合、新規作成した例外「ExampleSkipException」をスローするようにしている。これは、後述の「スキップ」設定で利用するためだ(実は、return nullを指定してInputデータのフィルタリングが可能だが、今回はスキップしたデータ数を明示的に保持するために例外をスローするようにしている)。

ItemProcessorを作成したら、これをSpring Batchの設定ファイル(module-context.xml)に定義しよう。

<bean id="exampleItemProcessor" class="example.ExampleItemProcessor" 
scope="step">
<property name="bizDate" value="#{jobParameters['bizDate']}" />
</bean>

バッチ引数をItemProcessorで受け取るため、「#{jobParameters[引数名]}」と指定している。

このとき、bean定義のscopeが"step"になることに注意してほしい(実は、先ほどのstep2FileItemReaderのBean定義でも同様の指定をしている)。

次に、Job定義を記述しよう。

<job id="job2" xmlns="http://www.springframework.org/schema/batch" 
incrementer="jobParametersIncrementer">
<step id="step2" parent="faultTolerantStep">
<tasklet>
<chunk reader="step2FileItemReader" processor="exampleItemProcessor" 
writer="writer" skip-limit="3">
<skippable-exception-classes>
<include class="example.ExampleSkipException" />
</skippable-exception-classes>
</chunk>
</tasklet>
</step>
</job>
…
<bean id="faultTolerantStep"
class="org.springframework.batch.core.step.item.FaultTolerantStepFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="jobRepository" ref="jobRepository" />
<property name="startLimit" value="100" />
<property name="commitInterval" value="1" />
</bean>

<step>タグのparentに、FaultTolerantStepFactoryBeanを指定した。このクラスはスキップ機能をサポートしている。今回は、FaultTolerantStepFactoryBean のpropertyはSimpleStepFactoryBeanと同様のままにした。

<chunk>タグにて、ItemReaderにはFlatFileItemReaderのBeanIDを指定する。ItemProcessorには先ほど作成したExampleItemProcessorのBeanIDを指定する。ItemWriterはサンプルと同じものをそのまま使用した。

次に、Spring Batchのスキップ機能を有効にするため、属性skip-limit を指定する。skip-limitはスキップ回数の上限値で、これを超えた場合Jobは失敗(Failed)する。 ついで、skippable-exception-classes 属性を指定する。Step実行時に発生した例外のうち、スキップして処理継続可能なものをタグで定義することができる。今回作成した「ExampleSkipException」を指定しておこう。