拡張サンプルの動作確認

では、拡張したバッチを実行してみよう。

CommandLineJobRunnerに以下の引数を与えて実行する。

classpath:/launch-context.xml job2 file=step2Input.csv bizDate(date)=2010/04/03

スキップ可能な例外トレース(example.ExampleSkipException)が発生するが、最終的には以下のような表示が出てJobが正常終了するはずだ。

…
<Step execution complete: StepExecution: id=0, name=step2, status=COMPLETED, 
exitStatus=COMPLETED, readCount=5, filterCount=0, writeCount=3 readSkipCount=0, 
riteSkipCount=0, processSkipCount=2, commitCount=6, rollbackCount=2>
…
<Job execution complete: JobExecution: id=0, startTime=・・・, endTime=null, 
lastUpdated=・・・, status=COMPLETED, exitStatus=exitCode=COMPLETED;
exitDescription=, job=[JobInstance: id=0, JobParameters=[{bizDate=1270220400000, 
file=step2Input.csv}], Job=[job2]]>

Step execution の行では、readCountが5でCSVのレコード数と一致している。一方、writeCountは3、processSkipCountが2となっている。ItemProcessorにより2件がスキップされたことが示されている。このときrollbackCountはスキップ数と同じ2件で、スキップにより正しくロールバックされることがわかる。CommitCountは6(レコード件数+1)となる。Step全体の処理としては、スキップ数が制限回数以内なのでCOMPLETEDとなっている。

Job execution の行でも、処理ステータス(status)はCOMPLETED(正常終了)で終わっている。なお、Jobパラメータとして、今回指定した2つが表示されていることがわかるだろう。([{bizDate=1270220400000, file=step2Input.csv}], Job=[job2])

次に、引数を bizDate(date)=2010/04/01 に変更して実行し、スキップ数の制限回数を超えた場合の動作を見てみよう。実行結果は次のようになるはずだ。

<Step execution complete: StepExecution: id=0, name=step2, status=FAILED, 
exitStatus=FAILED, readCount=5, filterCount=0, writeCount=1 readSkipCount=0, 
writeSkipCount=0, processSkipCount=3, commitCount=4, rollbackCount=5>
<Job execution complete: JobExecution: id=0, startTime=・・・, endTime=null, 
lastUpdated=・・・, status=FAILED, exitStatus=exitCode=FAILED;exitDescription=, 
job=[JobInstance: id=0, JobParameters=[{bizDate=1270047600000, 
file=step2Input.csv}], Job=[job2]]>

processSkipCountがMax値の3を超えたため、Step execution もJob executionもFAILEDになっている。

このJobは途中で失敗したことがわかるだろう。

*  *  *

以上、Spring Batchの基本的な動きを紹介した。

記事中でも紹介したが、本稿で用いたサンプル拡張コードはここからダウンロードできる。このZipファイルを、Spring BatchのZipが取り込まれているワークスペースに追加インポートすると、新しく「simple-cli-archetype-extension」というプロジェクトができるので、ぜひ試してみて欲しい。

今回は、Spring Batchの持つ豊富な機能のうち、残念ながら一部の機能しか紹介しきれなかったが、他にも非常に大事な機能がたくさんある。たとえば、

  • バッチのリスタート、リトライ
  • 複雑な処理順序を定義するためのFlowJob
  • スケーラビリティをあげる機能(マルチスレッド、Stepの並列実行、リモートチャンク、パーティショニング)
  • Hibernate、iBatisに対応したItemReader/ItemWriter

これらは非常に利用価値の高いものだ。Spring BatchのZipに含まれる「spring-batch-samples」プロジェクトの中には、これらの機能を確認できるサンプルコードが含まれているので、是非試してみてほしい。

SpringBatchを使うことで、開発者のプログラムは格段に軽量なものとなるはずだ。複雑なバッチコーディングにうんざりしている方は、ぜひSpringBatchの導入を検討してみてほしい。

執筆者紹介

加藤俊哉(KATO Shunya) - CSKシステムズ


J2EEのリリース時から継続してJavaのSI向けフレームワーク開発や導入支援などに従事。

近年クラウド向けテクノロジの調査開発に携わる。最近の関心記事は「SpringSourceの GemStone買収」。