jBatchを使ってバッチアプリケーションのサンプルを作ってみた

WebLogic Serverも、先日リリースされた12cR2でJava EE 7に完全対応となりました。
そこで、Java EE 7から加わった仕様である、jBatchを使って、簡単なサンプルアプリケーションを作ってみました。

jBatchそのものに関しては、主に以下の資料で勉強させていただきました。

サンプルアプリケーションの説明

今回作成したアプリケーションでやっている処理は至ってシンプルです。
chunk方式のメソッドが実行される順序を実際に見てみたかったので、1つのstepをchunk方式で実装し、以下のような処理を行っています。

  • ItemReader等の各インターフェースのメソッドが実行されたら、標準出力にその旨を出力する
  • ItemReader#readItem()、ItemWriter#writeItem()の実行回数をチェックポイント情報として返す
  • ItemWriter#writeItem()が実行されたら、readItem()、writeItem()の累積実行回数を標準出力に出力する

今回のアプリケーションのコードは、githubに公開してます。
コードを取得しでmavenでビルドすると、Java EEコンテナにデプロイするだけで実行可能なwarができ上がります。WebLogicでしか確認してませんが、シンプルなアプリなので他のコンテナでも大丈夫なはず…。

$ mvn package

ジョブの実行は、そのためのRESTのインターフェースを用意しています。以下のURLにGETリクエストを投げてください。

http://${host}:${PORT}/${CONTEXT_ROOT}/resources/JobController/Start

コード抜粋

以下、コードの抜粋です。Job定義とItemWriterの実装。

実行してみる

WebLogicにデプロイして、上記のRESTインターフェースを呼び出すと、標準出力に以下のような結果が出力されます。
ジョブ定義のitem-countの回数(3)だけreadItem(),processItem()を実行した後、writeItems()を1回実行、以下その繰り返しとなっているのがわかります。

jp.gr.java_conf.hhayakawa_jp.sample.jbatch.resource.JobController#start(31)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#open(62)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#open(54)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#writeItems(71)
ItemReader#readItem() has been executed [3] times.
ItemWriter#writeItem() has benn executed [1] times(including this execution).
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#checkpointInfo(41)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#checkpointInfo(33)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#readItem(79)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemProcessor#processItem(26)
…
ItemReader#readItem() has been executed [10] times.
ItemWriter#writeItem() has benn executed [4] times(including this execution).
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#checkpointInfo(41)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#checkpointInfo(33)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemWriter#close(42)
jp.gr.java_conf.hhayakawa_jp.sample.jbatch.SimpleItemReader#close(50)

今後、このサンプルをベースにいろいろ試してみたいと思います。
次回は、チェックポイントを使って中断/再開とか、試してみようかな。