バッチ引数で「日付」を指定し、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実行時に発生した例外のうち、スキップして処理継続可能なものを