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