Java EE 7 検証環境構築(9) jBatch 概要をおさえる
- Java EE 7 検証環境構築(1) WildFly + JBoss Tools で EARプロジェクトを作成し Arquillian で ユニットテストをグリーンにするところまで
- Java EE 7 検証環境構築(2) WildFly に DataSourceを作成
- Java EE 7 検証環境構築(3) JPAからMySQLに接続するユニットテストをArquillianで実行
- Java EE 7 検証環境構築(4) Java EE での DI(Dependency Injection) および CDI(Contexts and Dependency Injection)をながめる
- Java EE 7 検証環境構築(5) JBoss Toolsが生成したサンプルソースのCDIを確認する
- Java EE 7 検証環境構築(6) JPA エンティティの作成と挿入
- Java EE 7 検証環境構築(7) JPA 問い合わせ(1) 名前付きクエリを使ってみる。テストでトランザクションも意識する
- Java EE 7 検証環境構築(8) JPA 問い合わせ(2) 動的クエリとCriteria API を試す
- Java EE 7 検証環境構築(9) jBatch 概要をおさえる
- Java EE 7 検証環境構築(10) JBoss Tools で作成した EARプロジェクトをJava EE 6 から 7 に変更する
- Java EE 7 検証環境構築(11) jBatch用 プロジェクトの作成を行う
- Java EE 7 検証環境構築(12) jBatch 簡易サンプル作成と Arquillian でユニットテスト
- Java EE 7 検証環境構築(13) jBatch REST サービス経由で実行する
- Java EE 7 検証環境構築(14) WildFly の管理をGUIで行う
- Java EE 7 検証環境構築(15) WildFly を サービスとして設定する(Windows/Linux)
- Java EE 7 検証環境構築(16) WildFly と Apache を mod_jk で連携させる(Widows)
すこしずつ、Java EE 7 検証環境の構築を進めているが、実際のところ、ここまでは Java EE 6 で実現されていることで、Java EE 7 でなければならないものではない。
ただ、Java EE 7 は Java EE 6 の延長線上にあるものとのことなので、いずれにしても、Java EE 6 を理解しておく必要はあるのだが、Java EE 7 にこだわるのは、
Java EE 7から加わるバッチ仕様 Batch Aplications for the Java Platform
このjBatch を利用したみたいから。
しかし、残念ながら、まだ、Java EE 7 の適当な和書がない。
Java EE 7 Tutorial を適当に俺訳しながら、学ぼうかな~と思っていたら、
神サイトがありました。
The Java EE 7 TutorialのjBatchの章をテキトーに訳した
ということで、上記の3サイトを参考にしながら、jBatchの概要を把握していきたいと思う。
JPA周りをもっと突っ込んでいきたいが、時間的に先にjBatchを把握しておきたい。
1.概要
1.1.バッチジョブのステップ
ステップとは、バッチジョブの独立したシーケンシャルなフェーズ
以下のステップが含まれる
1.1.1 チャンク指向のステップ(Chank-oriented steps)
- データソースから複数件読み込みによるデータ処理をし、それらのデータにビジネスロジックを適用、結果を保存する。
- 一度に一件読み込み処理をしたのち、グループ化してチャンクに送る。
- 結果はチャンクが設定サイズに達したときに保存。
- 結果の保存を効率化し、トランザクション境界の管理を容易にする。
(1) チャンク指向のパート
- 入力・検索 : データソースから一度に一件読み込む
- ビジネスプロセス : ビジネスロジックにより一度に一件の処理
- 出力・書込み : 一度に一つのチャンク(処理された複数件)を保存
1.1.2 タスク指向のステップ(Task-oriented steps)
- データソースのデータを使用する処理以外のタスク実行
- 例えば、ディレクトリの作成や削除、ファイルの移動など
- チャンクステップに比べるとたいてい短時間
1.2.並行処理
バッチジョブはしばしば巨大なデータもしくは計算量が高価になる処理を実行する。バッチアプリケーションは、以下の並行処理シナリオから利益を得ることが出来る。
- ステップはお互い依存しておらず、別のスレッドで実行することが出来る
- それぞれのアイテムが直前の処理結果に依存していない、チャンク指向ステップの場合、複数のスレッドで実行出来る
バッチフレームワークは開発者に、チャンク指向ステップを分割し、並行処理出来るように、独立したステップグループを定義するメカニズムを提供する。
1.3.ステータスと条件分岐
1.3.1 ステータス
- バッチフレームワークはジョブでのステップごとにステータスを記録し続ける
- ステータスはステップが実行中か完了したかを示す
- ステップが完了した場合、ステータスは次にいずれかを意味する
- 正常終了
- 中断
- エラー
1.3.2 条件分岐
- バッチジョブには条件分岐を作成出来る
- 直前のステップの完了ステータスを使用する
Description of “Figure 55-2 Steps and Decision Elements in a Job”
1.4.バッチフレームワークの機能
以下のように共通機能を持つ
- ジョブ、ステップ、条件分岐の定義とそれらの関係の定義
- ステップグループの実行およびステップのパートを並行処理
- ジョブとステップのステータス情報を維持管理
- ジョブの起動と中断ジョブの再開
- エラー処理
バッチフレームワークは、バッチアプリケーションに共通な要求のためのインフラを提供し、開発者をビジネスロジックに集中できるようにする。以下から構成。
- ジョブとステップを記述するためのフォーマット
- API
- 実行を管理するサービス
2.Java EE でのバッチ処理
2.1 バッチ処理フレームワーク
以下の要素から構成
- ジョブの実行を管理するバッチランタイム
- XMLベースのジョブ定義言語
- バッチランタイム操作用のJava API
- ステップ、条件分岐、その他バッチあーティファクトを実装するためのJava API
Java EEのバッチアプリケーションはXMLファイルとJava クラスから構成される。
XMLファイルは、バッチアーティファクトを一単位とするジョブの構造とそれらを定義する
2.2 バッチジョブの作成
バッチアプリケーションを作成するための手順
- バッチアプリケーションの設計
- 入力データの入手元とフォーマット、要求処理結果、処理内容設計
- ジョブを、チャンク指向ステップ、タスク指向ステップ、条件分岐により構成し、依存関係を決定
- ステップ遷移を一単位とする実行順序を決定
- パラレル実行可能なステップと一つ以上のスレッドで実行可能なステップを特定
- ステップや条件分岐などをフレームワークが指定するインターフェースを実装したJavaクラスとしてバッチアーティファクトを作成。バッチアーティファクトはDIを使用してバッチランタイムからコンテキストオブジェクトを取得可能。
- ジョブ定義言語を使用してジョブとステップの実行フローをXMLに定義。
2.3 バッチジョブの要素
バッチジョブは以下の要素のうち、一つ以上から構成される
要素 | 内容 |
ステップ | チャンク指向、タスク指向 |
フロー | 一単位として実行されるステップのシーケンス |
スプリット | パラレルに実行するフローの組み合わせ。フローはそれぞれ別スレッドで実行され、すべて完了した時にスプリットは次へと遷移する |
条件分岐 | 前のステップの完了ステータスをもって、継続終了判定 |
2.4 プロパティとパラメータ
- ジョブとステップは、定義ファイルにプロパティを定義出来る。
- バッチランタイムからコンテキスト経由でプロパティを取得できる。
- バッチランタイムへジョブがサブミットされたとき、ジョブへパラメータを渡せる。
2.5 ジョブインスタンスと実行
- ジョブ定義は複数のインスタンスと、インスタンスごとにパラメータを持てる
- ジョブの実行とは、ジョブインスタンスを実行すること
2.6 バッチと完了ステータス
ジョブのステータス、ステップ、スプリット、フローはバッチランタイム上で文字列のバッチステータスとして表現される。
値 | 説明 |
STARTING | ジョブがバッチランタイムへサブミット済み |
STARTED | ジョブが実行中 |
STOPPING | ジョブが停止命令を受け取り済み |
STOPPED | ジョブが停止済み |
FAILED | ジョブがエラー終了 |
COMPLETED | ジョブが正常終了 |
ABANDONED | 破棄されたジョブ |
- JobOperator インターフェースを使用してジョブのバッチステータスを取得できる。
- ジョブ定義ファイルは、ジョブ定義言語(JSL:Job Specification Language) を使用してバッチステータスを参照出来る。
- バッチアーティファクトはコンテキストオブジェクトを使用してバッチステータスを取得できる。
- フローではフローの最終ステップのバッチステータスを指す
- スプリットでは以下となる
- COMPLETED - すべてのフローが COMPLATED
- FAILED - フローのいずれかが FAILED
- STOPPED - フローのいずれかが STOPPEDであり、FAILEDは一つもない
バッチステータスはバッチランタイムにより設定される。
完了ステータス
- バッチステータスベースのユーザー定義値である、完了ステータスを持つことが出来る。
- 完了ステータスはジョブ定義ファイルもしくはバッチアーティファクトで設定可能
と、チュートリアルで概要の説明はここまで。