IBM Brand Java EE7App Guide Batch
User Manual: Pdf
Open the PDF directly: View PDF .
Page Count: 84
Download | ![]() |
Open PDF In Browser | View PDF |
Java EE 7 アプリケーション設計ガイド JSR-352 Batch Applications for Java Platform 編 日本アイ・ビー・エム システムズ・エンジニアリング株式会社 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform Disclaimer この資料は日本アイ・ビー・エム株式会社ならびに日本アイ・ビー・エム システムズ・エンジニアリング株式会社の正式なレビュー を受けておりません。 当資料は、資料内で説明されている製品の仕様を保証するものではありません。 資料の内容には正確を期するよう注意しておりますが、この資料の内容は2015年11月現在の情報であり、製品の新しいリ リース、PTFなどによって動作、仕様が変わる可能性があるのでご注意下さい。 今後国内で提供されるリリース情報は、対応する発表レターなどでご確認ください。 IBM、IBMロゴおよびibm.comは、世界の多くの国で登録されたInternational Business Machines Corporationの商標です。他の製品名およびサービス名等は、それぞれIBMまたは各社の商標である場合があります。現 時点でのIBMの商標リストについては、www.ibm.com/legal/copytrade.shtmlをご覧ください。 当資料をコピー等で複製することは、日本アイ・ビー・エム株式会社ならびに日本アイ・ビー・エム システムズ・エンジニアリング株 式会社の承諾なしではできません。 当資料に記載された製品名または会社名はそれぞれの各社の商標または登録商標です。 JavaおよびすべてのJava関連の商標およびロゴは Oracleやその関連会社の米国およびその他の国における商標または登録 商標です。 Microsoft, Windows および Windowsロゴは、Microsoft Corporationの米国およびその他の国における商標です。 Linuxは、Linus Torvaldsの米国およびその他の国における登録商標です。 UNIXはThe Open Groupの米国およびその他の国における登録商標です。 2 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 目次 1. はじめに 1.1. バッチ処理 について 1.2. Javaバッチ登場の背景と現状の課題 1.3. JSR-352におけるバッチ処理 2. 構成要素 2.1. Job 2.2. Step 2.3. その他コンポーネント 3. JSL(Job Specification Language) 3.1. JSLとは? 3.2. その前に・・・・Listener と Properties 3.3. JSLでの変数使用 3 4. 各構成要素の説明と設定方法 4.1. Job 4.2. Step 4.3. Jobの処理順序制御 4.4. 実行要素 4.5. ジョブおよびステップのステータス 5. ジョブの管理・実装 5.1. JSR-352におけるバッチ処理のランタイム 5.2. ジョブの管理 5.3. ジョブの実装 6. サンプル・アプリケーション 6.1. 開発環境について 6.2. 開発の流れ 6.3. 手順解説 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 本文書の位置づけ この文書は、Java EE 7 アプリケーション設計ガイド シリーズにおいて、「JSR-352 Batch Applications for Java Platform」を対象に主に仕様解説の観点で記述したものです。 本文書の6章において、WAS Libertyをランタイムとして、サンプル・アプリケーションの開発から 実装までを紹介しています。 今後、この文書の記載内容をベースに、WAS Libertyでの実装例や役立つTipsなどをトピック 毎にまとめ、developerworksにて随時リリースする予定です。 – http://www.ibm.com/developerworks/jp/websphere/category/was/ 4 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 1. はじめに 1.1. バッチ処理 について 1.2. Javaバッチ登場の背景と現状の課題 1.3. JSR-352におけるバッチ処理 5 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 1.1. バッチ処理について バッチ処理とは? データを纏めて一括処理を行う処理方式 複数の手順からなる処理を自動的に連続して処理を行う処理方式 処理中にユーザーとの対話は発生しない そもそもなぜバッチ処理は必要か? 制約から派生する必要性 業務上の「締め」という概念 外部業務との連携上の制約 処理性能向上からの必要性 一括処理によりオーバーヘッド削減 リソースの有効活用(即時性が求められないものをバッチ処理) 6 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 1.2. Javaバッチ登場の背景と現状の課題 Javaバッチ登場の背景と現状の課題 企業内には、オンライン処理以外にも多様なワークロード の形態 が存在 –実行するタイミングが決まっている定例処理(日次処理、月次処理、期次処理等) –スループットが要求される一方で、即時性は要求されない処理 • (例:売り上げ集計、カード利用料金引き落とし、預金金利決算など) –膨大なCPU時間を要する金融シュミレーションなどの計算集約型処理 Webアプリケーション環境は、オンライン処理以外 が苦手(だった) –クライアント・サーバー型オンライン処理(1リクエスト1応答1同期点処理) –長時間処理に向かない(応答タイムアウトがある) 分散系との混在による運用コストの増大 ホスト系技術者の減少 7 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 1.2. Javaバッチ登場の背景と現状の課題 「独自フレームワークの群雄割拠と Java EEによる標準化」 Javaによるバッチ処理実行のために多くの製品やOSSが提供された IBMからWCG(WebSphere Compute Grid) OSSとしてはSpring Batchなど 各社の内製フレームワーク ・標準化の要請 ソフトウェア資産の保護やスキルの共通化 オンライン処理と利用技術の共通化 Java EE 7の策定にあたって新仕様として追加 JSR 352 Batch Applications for the Java Platformとして標準化 8 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 1.3. JSR352におけるバッチ処理 以下は、典型的なバッチ処理のアーキテクチャーです。 – ジョブは複数のステップから構成されます。 – ステップは1つのItemReader、ItemProcessor、ItemWriterを持ちます。 – ジョブは、JobOperator によって起動されます。 – ジョブの実行状況は、JobRepositoryに格納されます。 次章にて、これらのコンポーネントの詳細について説明します。 JobOperator Job 1 n Step 1 1 1 1 ItemReader 1 ItemProcessor 1 ItemWriter JobRepository 9 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 2. 構成要素 ここでは、JSR-352でのバッチ処理を概観し、主要な構成要素とその役割を紹介します。 2.1. Job 2.2. Step 2.3. その他コンポーネント 10 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 2.1. Job Job 「Job」は、バッチ全体のプロセスをまとめたエンティティです。 Jobは、1つあるいは複数の「Step」をまとめたもので、「Step」の制御情報や、各「Step」に 共通のプロパティー設定などを行います。Jobには、再起動処理の可否も設定します。 例えば・・・日次のジョブ JobInstance 「JobInstance」は、Jobの実行単位に相当します。例えば日次でのジョブの場合、 2015/10/06 のジョブ、などに相当します。 例えば・・・2015/10/06 のジョブ JobExecution 「JobExecution」Job実行の1試行に相当します。再処理などで実行した場合、それは 同じJobInstanceの異なるJobExecution、ということになります。また、ジョブの起動・再 起動時には、「JobParamter」を指定することができます。 例えば・・・2015/10/06 のジョブ、1回目の試行 11 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 2.2. Step Job Step 「Step」は、ジョブを構成する処理をまとめたオブジェクトです。よっ て、ジョブは1つ以上のステップで構成されることになります。バッチ 処理の実行・制御に必要な情報を含んでいます。 StepExecution 「StepExecution」は、Stepの実行の1試行に相当します。 StepExecutionは、Stepが実行された際に実際に生成されま す。前Stepの実行が失敗してStepが実行されなかった、などの 場合は生成されません。 JobInstance JobExecution 12 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 2.3. その他コンポーネント 「JobOperator」は、ジョブの処理に関連する、起動、停止などの操作 コマンドや、リポジトリの操作など、全ての管理的なインターフェースとなるコ ンポーネントです。 JobOperator Job 1 n Step 1 1 1 1 ItemReader 1 ItemProcessor 1 ItemWriter JobRepository 「JobRepository」は、実行中、および過去に処理したジョブの履歴 を保持するコンポーネントです。 JobOperatorを介してリポジトリの操作 を行います。 JobRepositoryには、JobInstance、 JobExecution、 StepExecutionが含まれます。 13 「ItemReader」は、Stepへの入力とな るデータの取得を担います。入力データが 枯渇した場合はその旨をStepへ伝えます。 「ItemProcessor」は、データの処理を 担います。 ItemReaderが取得したデー タの変換やビジネスロジックの実行を行い、 出力をItemWriterに渡します。 「ItemWriter」は、Stepからのデータの 出力を扱います。次に行う処理などには 関与せず、渡されたデータのみを扱います。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 3. JSL(Job Specification Language) JSLはジョブ、ステップ、およびそれらの実行を規定します。 JSR-352では、JSLをXMLで記述します。よって、JSLは"Job XML"と呼ばれることもあります。 3.1. JSLとは? 3.2. その前に・・・・Listener と Properties 3.3. JSLでの変数使用 14 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 3.1. JSLとは? 1. JSL(Job Specification Language)は、ジョブおよびステップの設定、およびジョブの処理内容の制御を 規定するためのXMLファイルです。 2. 各設定要素の包含関係は大まかには以下のような構造となっています。次章で各構成要素の設定・構成の詳 細を解説します。 その他、JSR-352 では以下の説明があります。これらについ ても、構成要素の説明の中に散りばめて説明します。 • 遷移要素(Transition elements) job step Chunk reader processor • 4.3. Jobの処理順序制御 (1/2) • バッチ・ステータス、Exitステータス writer batchlet partition partition split flow decision 15 実行要素 • (Execution elements) • 4.5. ジョブおよびステップのステータス (1/3) - バッチ・ステータ ス、Exitステータスとは? Job XMLでの変数使用 • 3.3. Job XMLでの変数使用 以降、エレメントと属性を以下のように現すこととします。 :エレメント :属性 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 3.2. その前に・・・・Listener と Properties 1. Listener と Properties – – – 2. これらは、Job XML内の各設定箇所で度々出てきますので、先立って説明します。 Listenerは、それぞれの設定項目の範囲で個別に設定が可能なもので、カスタムで自作したコードを呼び出すための拡張として用いる 事ができます。 Propertiesは、これらのListenerとして定義されたアーティファクトに、プロパティーとして渡す情報を定義するために使用されます。 役割 – Listener • ステップ実行の様々なフェーズをインターセプトするリスナー・アーティファクトを定義します。 chunk型のStepでは、リスナーのバッチ・アーティファクトは以下のインターフェースを実装します。 – StepListener, ItemReadListener, ItemProcessListener, ItemWriteListener, ChunkListener, RetryReadListener, RetryProcessListener, RetryWriteListener, SkipReadListener, SkipProcessListener, SkipWriteListener. – Propertities • バッチ・アーティファクトがバッチ・コンテキスト・オブジェクトを使用して取得できる、プロパティーの組み合わせを定義します。 listeners listerner 16 properties property © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 3.3. Job XMLでの変数使用 置換のルール –Job XML内では変数の使用が可能です。 –変数の解決は、ジョブの始動前に行われ、以下の順に変数値の設定の検索・置換が行われます。 • jobParameters – ジョブ起動時に渡されるジョブ・パラメーター(実際の使用イメージはP80参照)でパラメーター/値が設定されます。 • jobProperties – JSL内で指定されているパラメーターに対して値の設定・検索がなされます。 • systemProperties – システム・プロパティーとして定義されているパラメーターに対して値が検索されます。 • partitionPlan – パーティション・マッパーによって返されるパーティション・プラン内で有効なパラメーターが返されます。 – これは、定義されているパーティション・スコープ内でのみ有効です。 17 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4. 各構成要素の説明と設定方法 ここでは、各構成要素の設定項目、およびその方法について解説します。 JSL内での設定項目と共に、その設定項目の機能解説をしています。 4.1. 4.2. 4.3. 4.4. 4.5. 18 job step ジョブの処理順序制御 実行要素 ジョブおよびステップのステータス © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.1. job - 設定項目 1. job ジョブ定義は、最も粒度の大きい要素になります。 id 項目 restartable id ジョブの論理名を指定します。ジョブの識別に使用されます。XMLの String属性の規約に従う必要があります。必須項目です。 restartable このジョブが再始動可能か否かを true/false で指定します。オプ ショナルです。デフォルトは true です。 step flow split decision 説明 2. Step、Flow、Split、Decision の実行要素を子要素として持ちま す。(詳細については後述) 3. listeners、propertiesの定義が可能 listeners properties 1. 2. 19 P16 で説明した listeners で処理をインターセプトして実行するアーティ ファクトの定義が可能です。 ジョブ・レベルのプロパティーでは、ジョブ・コンテキスト全体で取得可能なプ ロパティーの設定が可能です。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - stepの属性情報、実行タイプ job 1. step id ステップは、ジョブ実行時の最小単位です。属性として以下を持ちます 。 項目 start-limit allow-start-if-complete next id ステップの論理名を指定します。ジョブの識別に使用されます。XML のString属性の規約に従う必要があります。必須項目です。 start-limit このステップの起動、再起動で許容される試行回数を指定します。 デフォルトは0で、無制限を意味します。この回数以上の試行がなさ れた場合はステップはFAILEDで終了します。 allow-start-ifcomplete ジョブの再実行時に、(例え前回の試行が正常終了していたとして も)このステップの再処理を行うか否かを true / false で指定しま す。true の場合実行します。デフォルトは false です。 next このステップの終了後に行う次の実行要素を指定します。step、 flow、split、decision のいずれかを指定します。Loopが発生する ような定義はできません。 chunk batchlet partition next 説明 stop end fail listeners 2. ステップの実行タイプは、以下の2種類があります。 1. 2. 「chunk(Chunk指向型処理)」 「batchlet(タスク指向型処理)」 properties 20 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - chunk(Chunk指向型処理)の詳細 (1/2) JSR-352では、バッチの処理形態として、「chunk(chunk指向型処理)」と「batchlet(タスク指向型処理)」を扱います。中でも、 chunkパターンを基本の処理としています。chunkパターンでは、データを1回につき1 Item取得(ItemReader)し、処理( ItemProcessor)したうえでchunk(データの塊)として出力(ItemWriter)します。出力は、指定した条件(データの個数もしくは時 間)に合致しときにまとめてコミットされます。 以下は、この振る舞いをシーケンスで模式的に表したものです。 execute() ItemProcessor ItemReader Step ItemWriter read() item process(item) item read() item process(item) write(コミット)はまとめて実施 item write(item) ExitStatus 21 : 繰り返し © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - chunk(Chunk指向型処理)の詳細 (2/2) job 1. step chunkは 属性として以下を持ちます。 chunk checkpoint-policy 項目 説明 checkpoint-policy コミットの振る舞いを規定するチェックポイントのポリシーを"item"もしくは "commit"で指定します。itemを指定した場合は一定数の処理後にチェックポ イントを取得します。custom指定の場合は、別途指定するcheckpointalgorithmの実装に応じてチェックポイントを取得します。デフォルトはitemです。 item-count ポリシーがitemの場合に、チェックポイントを取得するchunkに含まれるitem数 を指定します。デフォルトは10です。 time-limit ポリシーがitemの場合に、チェックポイントを取得する間隔を秒数で指定します。 デフォルトは0で、無制限(すなわち、時間間隔では取得しない)です。itemcountとtime-limitの両方が指定されている場合は、最初にいずれかの条件に 合致した時点でチェックポイントが取得されます。 skip-limit スキップ対象として定義した例外が、何回発生したらステップをスキップするか、と いう回数の定義を行います。デフォルト無制限です。 retry-limit リトライ対象として定義した例外が、何回発生したらステップを処理をリトライする か、という回数の定義を行います。デフォルト無制限です。 item-count time-limit skip-limit retry-limit checkpoint-algorithm ref properties reader ref processor ref 2. processor これらには、作成したアーティファクトを指定します。 ref 項目 : 続く 22 ref 説明 それぞれの項目に対応するアーティファクトを指定します。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 【参考】 チェックポイント チェックポイント機能とは、バッチが障害などの理由で途中停止した場合に備えて指定タイミングで定期的にコミットを取り、その 進捗を記録することで、回復時に再実行可能な状態にしておく機能です。リスタート機能はチェックポイントの情報を読み取り、 再実行された際に最後にコミットしたレコードの次の行からの処理を行う機能です。 チェックポイント取得のインターバル、頻度は、システム全体のパフォーマンスに大きく影響するため、チューニングは非常に重要で す。 更新 更新 更新 更新 更新 UOW 更新 更新 更新 更新 チェックポイント取得 更新 ロールバック 障害発生 23 再実行時は ここから再開 更新 更新 更新 更新 更新 更新 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - chunk(chunk指向型処理)の詳細 - 例外発生時の対応(1/2) ステップ実行中に例外が発生した場合は・・・デフォルトでは、Exitステータス:FAILEDで終了します。 しかし・・・reader / processor / writer にたいして、予め特定の例外を定義しておくことで、スキップ / リトライを設定できま す。 – スキップ • chunkの子エレメントとして、スキップ対象とする例外クラスを指定 – リトライ • 同じくchunkの子エレメントとして、リトライ対象とする例外クラスを指定 • デフォルトのリトライの振る舞いとしては、chunkをロールバックして、(デフォルトの)チェックポイント・アルゴリズムに基づいてitemcount1から再開 • オプションのchunk Listenerがstepに対して設定されている場合は、ロールバックの前にonErrorメソッドが呼ばれる • リトライ時にロールバックしない方法も指定可能 – retryable-exception-classes、 no-rollback-exception-classes、両方に同一の例外が指定がされている場合、その例外発生時にロール バックはされません。 但し・・・・・ – 同じ例外がスキップ/リトライの両方で指定されていた場合は、リトライが優先されます。 – リトライの実行中に、リトライ発生のトリガとなった例外と同じ例外が再度発生した場合、そのステップはスキップされます。 – 設定方法については次ページを参照ください。 24 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - chunk(chunk指向型処理)の詳細 - 例外発生時の対応(2/2) job 1. Step chunk chunkの例外発生時対応のエレメントとして以下を持ちます。 – skippable-exception-classes • 前頁記述のとおり、スキップ対象とする例外、スキップ対象としない例外を指定します。 skippable-exception-classes include class – exclude class retryable-exception-classes • 前頁記述のとおり、リトライ対象とする例外、リトライ対象としない例外を指定します。 retryable-exception-classes – include class no-rollback-exception-classes • リトライ対象として指定されている例外のうち、(デフォルトの振る舞いであるロールバッ ク後のリトライをオーバーライドして)ロールバックせずにリトライを行う対象の例外、対 象外の例外を指定します。 exclude class no-rollback-exception-classes include class exclude class 2. それぞれのクラス指定では、以下の属性を持ちます。 項目 properties 25 説明 include class 対象とする例外クラスもしくは例外のスーパークラスを指定します。複数指定可 能です。 exclude class 対象から除外する例外クラスもしくは例外のスーパークラスを指定します。複数 指定可能です。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - batchlet(batchlet指向型処理)の詳細 job Step batchlet 1. 2. ref properties 3. batchlet型は、chunk型と比較してよりシンプルな処理形態です。 chunk型のような読み込み、処理、書き込み、の一連の流れではな く、ファイル転送や印刷、コマンド実行、などのタスク型の処理に適して います。 batchletの設定は非常にシンプルで、実行対象となるアーティファクト を指定し、必要に応じてプロパティーの設定をするのみです。以下の 様な指定を行います。 項目 ref 4. 26 説明 Batchletとして実行するアーティファクトを指定します。 batchletインターフェースの詳細は、「5.3. ジョブの実装 - batchlet 方式ステップの実装」 を参照ください。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - stepのパーティショニング(1/4) バッチステップは、パーティション化により複数のインスタンスに処理を分割して並行処理させる事ができます。 – パーティションの分割について • パーティション化されたステップは、複数のインスタンスで実行されます。 • スレッドおよびパーティションの数は、パーティション・マッパーからの呼び出し、もしくは、JSL内(partition下のplanエレメント)で指定 します。 • 各パーティションには、どの範囲のデータを扱えばよいのか、というパラメーターを渡す必要があります。 • 各スレッドはそれぞれ独立したコピーのステップとして動作します。よって、チェックポイント取得なども各パーティションでそれぞれ独立して 行われます。 • パーティション・リデューサーで、各パーティションの結果を統合・協調させることができるので、どこかでエラーが発生した場合に全体をバッ クアウトをさせる、という様なことも可能です。 – 各パーティションの処理結果の統合について • 各パーティションの実行結果は、全体のステップの結果としてどうだったか判定する必要があります。 • PartitionCollectorとPartitionAnalyzer がこの結果判定を担います。 27 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - stepのパーティショニング(2/4) stepのパーティショニング – Partition Mapper(パーティション・マッパー) • パーティション数とスレッド数を計算するプログラムをパーティション・マッパーとして定義できます。 • また、パーティション・マッパーは、各パーティションで参照するプロパティーも指定できます。 • 機能的に重複しますので、パーティション・プランを設定した場合は、Partition Mapperは使用できません。 – Partition Reducer(パーティション・リデューサー) • パーティション処理において、UOW(Unit Of Work)の分割を行う機能を提供します。 • このパーティション・マッパーを利用してパーティション・ステップのライフサイクルにプログラム的に介入することが可能になります。 – Partition Collector(パーティション・コレクター) • 各パーティションの実行結果をアナライザーに中継します。パーティションを実行するスレッド毎に別々のコレクターが稼動します。 • Chunk型ではチェックポイント取得時、およびステップ終了時に起動されます。batchlet型ではステップの終了時のみ起動されます。 • コレクターは、シリアライズされたjavaのオブジェクトをanalyzerに返します。 – Partition Analyzer(パーティション・アナライザー) • ステップのメインのスレッドで稼動し、パーティション・コレクターから、各パーティションの実行結果を受信します。 • 各パーティションの処理終了後、各パーティションのExitステータスを受信します。 • アナライザーは、各パーティションの実行結果に応じてそのステップの実行結果をどう扱うか、のカスタムExitステータスの扱いを規定しま す。 28 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - stepのパーティショニング(3/4) job 1. step partition plan では、パーティション化されたstepの実行に関わる設定を行いま す。設定項目は以下のとおりです。 項目 plan partitions partitions パーティション化されたステップのパーティションの数を指定します。オプショナルな 属性で、デフォルトは1です。 threads ステップが実行するスレッド数の最大値を指定します。JSR-352の仕様としては、 要求された実行スレッド数でのステップ実行を保証するわけではない、としていま す。オプショナルな属性で、デフォルト値はpartitionsで指定されたパーティション 数です。 threads properties 説明 partition name value 2. また、各パーティションそれぞれに対してプロパティーを設定することがで きるようになっています。これを利用して、例えばパーティション毎に異な る処理対象ファイルを指定したり、処理対象のデータ範囲を指定した りすることができる様になります。 項目 29 説明 partition プロパティーを適用する、0から始まるパーティション番号を指定します。 name プロパティー名を指定します。 value nameに対応するプロパティー値を指定します。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.2. step - stepのパーティショニング(4/4) job 1. step partition mapper 「4.2. step - stepのパーティショニング(1/4)」で説明した、パー ティション化された処理を担う各コンポーネントの設定は、以下のように 行います。 項目 ref ref properties 説明 パーティション化されたステップのパーティションの数を指定します。オプショナルな 属性で、デフォルトは1です。 reducer ref properties 2. また、propertiesエレメントとして、各バッチ・アーティファクトに渡すプロ パティー情報を以下の様に設定します。 collector ref properties analyzer 項目 説明 name 各バッチ・アーティファクトに渡すプロパティー名を指定します。 value 各プロパティーに対応する値を指定します。 ref properties 30 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.3. Jobの処理順序制御 (1/2) 実行要素(execution element)と遷移要素(transition element) – ジョブの処理の流れは、実行要素のスコープ内で定義される遷移要素に応じて、次に実行する実行要素を指定するか、次 のジョブ実行を終了させるかを定義することで行います。 – つまり、実行要素の結果に応じて、次にこの実行要素を実行する、ジョブを終了させる、などの遷移要素の設定を行って制 御することになります。 実行要素 – step / flow / split /decision があります。詳細は次ページ以降で解説します。 遷移要素 – 以下の要素があります。詳細は次ページで解説します。 • • • • 31 next エレメント fail エレメント end エレメント stop エレメント © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.3. Jobの処理順序制御 (2/2) next エレメント job step – 指定された、次の実行要素を実行します。 next on to fail エレメント – ジョブを、FAILEDのバッチ・ステータスで終了させます。 end エレメント – ジョブを、COMPLETEDのバッチ・ステータスで終了させます。 fail on exit-status end on exit-status stop エレメント – ジョブを、STOPPEDのバッチ・ステータスで終了させます。 – 併せて、ジョブがリスタートされた際に実行するジョブ・レベルでのstep、flow、 splitを指定します。 項目 on(必須) (next, fail, end, stop で共通)Exitステータス値を指定します。"*"(0 以上の文字列の合致)と、"?"(1文字の合致)を使用できます。 on to(必須) (next のみ)適用された場合に次に遷移する実行要素のidを指定します。 exit-status exit-status (任意) (fail, end, stop のみ)指定した値でジョブに新しいExitステータスをセットし ます。指定しなかった場合は更新されません。 restart(任意) (stop のみ)ジョブの再始動時に再始動の対象となるジョブ・レベルのstep、 flow、splitを指定します。 stop restart 32 説明 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.4. 実行要素 - flow flowは、1つの単位内で実行する、実行要素の順序制御を定義するものです。 flowは、step、split、decision、もしくは別のflow に遷移できます。 また、flowは、その処理単位内にstep、flow、decision、splitを定義する事ができます。 flowは、内部で更にstep、flow、decision、splitを定義する事が できます。 flow step decision split flow flow内部で定義されている実行要素は、同じflow内 の実行要素にのみ遷移できます。それ自身が定義され ているflow外の実行要素へは遷移できません。 flow next fail end stop flowの実行結果および定義した遷移要素に応じて次にどのようなス テータス、処理をとるかが決定されます。 step FAILED COMPLETED flow decision split 33 STOPPED Syntax; ジョブ終了© 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.4. 実行要素 - split splitは、同時に処理するflowを定義するために使用されます。 splitは、flowのみを子エレメントとして持つことができます。各子flowは異なるスレッドで実行されます。 splitの子エレメントとして定義された全てのflowの実行が終了した段階で、splitの処理が完了します。 splitの次は、step、flow、decision、もしくは他のsplitに遷移できます。 split flow flow next ・・・・ splitの内部(並行して処理する実行要素)には、 flowのみを定義する事ができます。 定義されたflowは別スレッドで並行して処理されます。 splitの後続処理として、step、flow、decision、もしくは他のsplit の何れかを指定できます。 step flow decision split 34 Syntax; ... ...© 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.4. 実行要素 - decision decisionを用いることで、順次処理で次に行うべき処理の判断をカスタマイズすることが可能です。 decisionは、step、flow、splitもしくは他のdecisionのnextエレメントのターゲットとして指定します。 decisionとして、判断のロジックをもつアーティファクトを指定する必要があります。 decisionでは、判断の根拠にstop、fail、end、next エレメントを使うことができます。 – 戻り値は、現在のジョブのexit statusにもセットされることになります。 decisionの例外処理 – decider(decisionに登録されたアーティファクト)で例外が発生すると、バッチはFAILEDのステータスで終了します。 step next split decision flow next next next step、flow、splitもしくは他のdecisionから遷移できます。 判断ロジックを記述したアーティファクトを定義します。 decision 処理結果から、遷移要素を決定します。 next step flow decision split 35 fail FAILED end stop COMPLETED ジョブ終了 STOPPED Syntax; ... ...指定例: ... © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.5. ジョブおよびステップのステータス (1/3) - バッチ・ステータス、Exitステータスとは? バッチ・ステータス と Exitステータス – バッチジョブの実行ステータスは、ジョブ単位、およびステップ単位で管理されます。 – これらのステータスには、ランタイムが管理する 「バッチ・ステータス」 と、ユーザーが定義する 「Exitステータス」 の2種類があります。 – バッチ・ステータスはランタイムによって決定されますが、ExitステータスはJSLやプログラムの中で決定されます。 • ステップの Exitステータスはデフォルトでnullであり、StepContextオブジェクトのexit-status Setterメソッドによって値が設定されます。 • 特にバッチ・アーティファクトによって明示的に設定されなかった場合は、ランタイムによってデフォルトのステータスが設定されます。 • バッチ・ステータスの一覧は次ページを参照ください。 ジョブの停止条件とステータスの関係 – ステータス:COMPLETED • ジョブ・レベルの実行エレメント(step、flow、split)が、next指定なし、もしくはtransitionエレメントでの指定ステータス以外で終了した場合、ジョブは COMPLETEDに設定されます。 – スーテタス:FAILED • stepがランタイムに、skipもしくはretry対象とならない例外をスローした場合、ジョブはFAILEDに設定されます。 • また、パーティション化された、もしくは同時実行(split)されたステップが処理中の場合、それら実行中のインスタンスは継続して処理を行いますが、最終的 にはFAILEDで終了します。 – ステータス:STOPPED、COMPLETED、FAILED • step、flow、dicisionがstop、end、failエレメントで終了した場合、ジョブは、それぞれSTOPPED、COMPLETED、FAILEDで終了します。 36 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.5. ジョブおよびステップのステータス(2/3) - バッチ・ステータス一覧 以下はバッチ・ステータスの一覧です。 ステータス STARTING JobOperatorのスタートおよびリスタートの操作によって、バッチジョブがランタイムに渡された状態です。 実際にジョブが実行される前にこの状態になります。 STARTED ランタイムによってバッチジョブの処理が開始された状態です。処理が開始されるとこの状態になります。 STOPPING JobOperatorのストップもしくは、JSLのエレメントによって、ジョブの停止が要求されている状態 です。JobOperatorが停止要求を受けるとすぐにこの状態になります。 STOPPED JobOperatorのストップもしくは、JSLの エレメントによる停止要求によって、ジョブが停止した状 態です。ランタイムによってジョブが停止された後にこの状態になります。 FAILED 37 説明 バッチジョブが解決されない例外もしくはJSLの エレメントによって、停止された場合にこの状態に なります。 COMPLETED バッチジョブが正常終了、もしくは エレメントによって停止した場合にこの状態になります。 ABANDONED JobOperatorのabandon操作によってマークされるとこの状態になります。abandon(破棄)された ジョブは、処理も再処理もできませんが、履歴としては残ることになります。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 4.5. ジョブおよびステップのステータス(3/3) - ステータス遷移例・イメージ 以下は、ジョブおよびステップのステータス遷移の模式的にあらわした図です。(厳密なタイミングについては前頁の説明を参照ください。) – ここでは、赤字でジョブのバッチ・ステータス、青字でステップのExitステータスを表しています。Exitステータスはステップのフロー制御で使用されています。 job STARTING 指定例: Step 1 RC1 Exit コード? その他 RC2 Step 2-1 STARTED Step 2-2 Exit コード? STOPPING Step 3 RC4 STOPPED 38 RC3 COMPLETED FAILED © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5. ジョブの管理・実装 ここからは、ジョブを実行する環境、ジョブの起動について解説すると共に、どのようにジョブを作成するか、について解説します。 5.1. JSR-352におけるバッチ処理のランタイム 5.2. ジョブの管理 5.3. ジョブの実装 39 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.1. JSR-352におけるバッチ処理のランタイム JSR-352のバッチランタイムは、ジョブXML による処理の順序制御、チェックポイントによるレコード単位のコミット、 スキップ処理などの実行環境を提供しています。ジョブ、ステップの単位でプロパティーをサポートしています。 バッチ・システムを作るためのAPI の提供に主眼を置いているため、JAX-RS やJSF などからJobOperator を呼 び出してジョブを実行します。 JSR-352のバッチランタイムが提供するプロパティー名の接頭辞にはjavax.batch が規定されています。 jBatchRuntime Job Step EJB/JAX-RS/Servlet JobOperator ItemReader ItemProcessor ItemWriter CSV/XML/JSON/J DBC/JPA Job.xml Step Batchlet CSV/XML/JSON/JD BC/JPA Listener Context Metric JobRepository 40 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.2. ジョブの管理 - ジョブオペレーター ジョブの開始や停止などの全体的な制御には、ジョブオペレーターを利用します。 – インターフェース:javax.batch.operation.JobOperator – JobOperator インタフェースは、jobの開始・停止・リスタート・検査するための操作セットです。 JSR-352には、ジョブオペレーターの呼び出し方に関する規定はありません。そのため、ジョブオペレーターを呼び出 すコードが含まれるクラスを作成し、それをJAX-RSやJSF、EJBなどで実行します。また、jBatch の仕様にはバッチ を決まった時間に起動する方式や、それを実行するAPI も含まれていません。cronやタスクスケジューラーなどのジ ョブスケジューラーと連携させて使用します。 ジョブオペレーターの呼び出しの例 ジョブスケジューラ Shell Script .bat ファイル Application Server (Java EE コンテナ) jBatch コンテナ JAX-RS EJB jobOperator .start() .stop() .restart() CDI ブラウザなどから 直接実行 41 JSF © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.2. ジョブの管理 - ジョブの開始 ジョブの実行はジョブオペレーターが提供するメソッドを利用します。JobOperator には、start()、stop()、 restart() などのメソッドが含まれています。JobOperator インターフェースは、BatchRuntime クラスの getJobOperator() メソッド経由でコンテナから取得します。 ジョブの開始は、ジョブXML を指定して起動します。start() の第一引数はJobId( Job.xml 名)を、第二引数 にはジョブのプロパティーを指定します。ここで指定したプロパティーは、Job.xml の中やジョブを構成するクラスの中 で取得可能です。返り値はジョブを実行すると割り振られるJobExecution のId です。 ジョブ実行の例 Properties p = new Properties(); ・・・ JobOperator jobOperator = BatchRuntime.getJobOperator(); //start long jobExecId = jobOperator.start("JobSample" , p); Job.xml 名とジョブプロパティーを引数にし て起動します。ジョブの実行は BatchRuntimeを介して行います。 42 Job.xml の配置については、「5.3. ジョブの実装 Job XMLのロード」を参照ください。 JobSample.xml © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.2. ジョブの管理 - ジョブランタイムId 最初にジョブを実行するとコンテナ内部でJobInstance とJobExecution が生成されます。その際に、それぞ れにId が割り振られます。 JobInstance はジョブの1回分を、 JobExecution は実行そのものを表しています。 以下のId でジョブランタイムを定義します。instanceId, executionId, stepExecutionId は、ジョブリポジトリ 内で一意の値である必要があります。 Id 説明 instanceId ジョブのインスタンスを表すIdです。新しいジョブインスタンスは、バッチランタイムからJobOperator を取得し、 start メソッドを呼び出して開始することができます。 executionId 特定のジョブインスタンスを実行する際に使用するId です。ジョブのリスタート、停止時に引数に指定します。 JobOperator を取得してrestart、stop メソッドを呼び出します。 stepExecutionId ジョブの中で特定のステップを実行するIdです。 ジョブの実行例(停止・再起動) ・・・ //stop long jobExecId = jobOperator.stop( execId ); //restart long jobExecId = jobOperator.restart( execId , p); 43 executionId を指定してジョブを停止 します。 executionId はstart 実行 時の返り値です。 executionId とジョブプロパティーを引 数にして再起動します。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.2. ジョブの管理 - JobInstance とJobExecution の関係 ジョブがエラーにより中断したり、stop() により明示的に中断が指示された場合は、そのジョブに対してrestart() を指示することができます。この場合、再開前のJobInstance に対して、別のJobExecution のインスタンスが 生成されます。そのJobExecution には新たなJobExecutionId が生成されます。こうした各ジョブの状態や履 歴に関する情報はジョブリポジトリに保存されます。JobOperator のstop() やrestart() を実行するときの引数 には、JobExecutionId を指定します。 JobInstanceId JobExecutionId 1 1 2 2 JobA.xml jobOpertor.start("JobA , p") jobOpertor.start("JobA , p") 2 3 再実行の際にJobExecutionId を指定します。 44 完了 中断対象のJobExecutionId を指定します。 jobOperator.stop(2); もしくはエラー等による中断 jobOpertor.restart("2 , p") 完了 再開対象のJobExecutionId を 指定します。 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - jBatchのランタイム インターフェース 次頁から以下4つのインターフェースについて記載します。 –chunk方式ステップ • ItemReader、ItemProcessor、ItemWriter –batchlet方式ステップ • batchlet jBatchRuntime EJB/JAX-RS/Servlet JobOperator Job Step < > ItemReader < > ItemProcessor < > ItemWriter CSV/XML/JSON/J DBC/JPA Job.xml Step < > batchlet CSV/XML/JSON/JD BC/JPA Listener Context Metric JobRepository 45 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - chunk方式ステップの実装 ItemReader ItemReader – インターフェース:javax.batch.api.chunk.ItemReader – ItemReader はchunk型ステップで加工や計算を行うための情報をデータベースやファイルなどから読み込みます。 以下のメソッドが規定されています。 – open() • 情報が格納されているリソースを開く処理を実装するためのメソッドです。 • 引数にはチェックポイントの情報を指定します。 – close() • open() でアクセスしたリソースを閉じる処理を実装するためのメソッドです。 – readItem() • open() で開いたリソースからレコードを1件ずつ読み取る処理を実装するためのメソッドです。引数はなく、戻り値は Object 型です。この戻り値がそのままItemProcessor に渡されます。読み取るレコードがなくなったとき、戻り値null を返し、ItemProcessor にレコードが渡されなくなります。 – checkpointInfo() • 「5.3. ジョブの実装 - chunk方式ステップの実装 ItemWriter」 参照 46 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - chunk方式ステップの実装 ItemProcessor ItemProcessor – インターフェース:javax.batch.api.chunk.ItemProcessor – ItemReader で読み込まれた情報を1件ずつ受け取り、加工や計算などの処理をする役割を担います。 以下のメソッドのみが規定されています。 – processItem() • 引数には、ItemReader のreadItem() で戻り値として設定された情報が格納されます。 • processItem() の戻り値はItemWriter のwriteItem() に渡す情報です。 • チェックポイントが実行されるまでprocessItem() の戻り値はアプリケーションサーバーの中で保持されています。仮に前 回のチェックポイントから数件を処理した後、次のチェックポイントをむかえる前にハンドリング不可能なエラーが発生した場 合、トランザクションはロールバックされて内部的に保持していた情報はクリアされます。 • 再実行した場合は、前回のチェックポイント時点(ItemReader のcheckPointInfo() で記録された時点)から再 開されるため、クリアされても問題はありません。 47 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - chunk方式ステップの実装 ItemWriter ItemWriter – インターフェース:javax.batch.api.chunk.ItemWriter – ItemProcessorで処理されたデータを書き出す処理を行います。 以下のメソッドが規定されています。 – open():ItemReader と同様。 – close():ItemReader と同様。 – writeItem() • ItemProcessor のprocessItem() で処理した結果を受け取り、データベースやファイルに書き出す処理を実装しま す。 • チェックポイントのタイミングで呼び出されるため、複数件のアイテムがObject 型、List 形式で渡されます。 – checkpointInfo() • 処理の途中経過を記録するためのメソッドです。checkpointInfo() の戻り値は、コンテナが内部で保持しているデー タストアに永続化されます。そのため、戻り値はSerializable インターフェースを実装したクラスである必要があります。 • 永続化された情報はopen()の引数として渡されます。初回起動時、もしくはチェックポイントの前に終了したバッチの再 実行時、あるいはcheckpointInfo() の戻り値としてnull を返していた場合は、この値はNull になります。 checkpointInfo() でNull 以外の値を返していた場合は再実行時のopen() の引数にその値がセットされます。 48 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - batchlet方式ステップの実装 Batchlet – インターフェース:javax.batch.api.Batchlet 以下のメソッドが規定されています。 – process() • batchletが担う機能を実装するためのメソッドです。引数はなく、戻り値はString 型です。 • 戻り値に指定した文字列は、このステップの終了ステータスとしてコンテナに解釈されます。 – stop() • batchletの処理中に(process() の実行中)に、ジョブ全体の中断が指示された場合に呼び出されるメソッドです。 • このメソッドは、process() を実行しているスレッドとは別のスレッドで実行されているため、process() の処理に直接 割り込むことはできません。 • 注意点として、ジョブ全体の中断が指示されても、process() の処理が中断されない場合もあります。JobOperator クラスのstop() メソッドにより指示します。 49 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - ジョブメトリック メトリックはchunk型のステップに対して実行時の統計情報を提供します。 – インターフェース:javax.batch.runtime.Metric 提供される情報は読み取りレコード数、書き込みレコード数、スキップが発生した数など、処理量に関するものです。 以下のようなメトリックを提供しています。これらのメトリックはStepExecution クラスから呼び出します。 – インターフェース:javax.batch.runtime.StepExecution 50 メトリック 説明 readCount 読み取りが成功したレコード数 writeCount 書き込みが成功したレコード数 filterCount データの加工などの処理をしたレコード数 commitCount トランザクションのコミットしたレコード数 rollbackCount トランザクションのロールバックしたレコード数 readSkipCount 読み取り時にスキップが発生したレコード数 processSkipCount データの加工などの処理時にスキップが発生したレコード数 writeSkipCount 書き込み時にスキップが発生したレコード数 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - JobContext JobContext – インターフェース:javax.batch.runtime.context.JobContext 現在のジョブ全体に関する情報を提供する役割を担います。必要に応じて任意の値(UserData)をセットすることもできます。 JobContext のインスタンスは右記のように定義することでコンテナによってインジェクトされます。 以下はJobContext インターフェースが持つメソッドです。詳細はJavaDoc を参照してください。 @Inject private JobContext jctx ; 1. ジョブ全体の名前やID に関する情報の取得 • getJobName()、getExecutionId()、getInstanceId() 2. ジョブ全体のステータスに関する情報の取得と登録 • getBatchStatus()、getExitStatus()、setExitStatus() 3. ジョブ全体の属性に関する情報の取得と登録 • getProperties()、getTransientUserData()、setTransientUserData() – JobContext とStepContext はステップを実装するクラスのコンストラクタの中からはアクセスすることはできません。各クラスのコンストラクタ は、コンテナによりインスタンスが生成される時点で実行されますが、その時点ではまだコンテキストは生成されていません。そのため、ジョブ全 体の初期処理はコンストラクタではなく、open() の中で実装します。 (参考) Java Documentation - Interface JobContext • https://docs.oracle.com/javaee/7/api/javax/batch/runtime/context/JobContext.html 51 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - StepContext StepContext – インターフェース:javax.batch.runtime.context.StepContext 現在のステップ全体に関する情報の提供および設定を行います。 以下はStepContext インターフェースが持つメソッドです。詳細はJavaDoc を参照してください。太字はJobContextに同等 のメソッドがないものです。 1. ステップ全体の名前やID に関する情報の取得 – getStepName()、getStepExecutionId() 2. ステップ全体のステータスに関する情報の取得と登録 – getBatchStatus()、getExitStatus()、setExitStatus()、getExecution()、getMetrics() 3. ステップ全体の属性に関する情報の取得と登録 – getProperties()、getTransientUserData()、setTransientUserData()、getPersistentUserData()、 setPersistentUserData() getExecution():ステップ内で最後に発生した例外クラスが取得できるメソッドです。getPersistentUserData()、 setPersistentUserData():ステップ内部で共通に利用する任意の値の設定と取得ができます。set メソッドを通して設定さ れた値は、コミットのタイミングで永続化されます。一度永続化されたものはジョブが一度停止し、再実行した際でもget メソッドを 通して取得することができます。 – (参考) Java Documentation - Interface StepContext • http://docs.oracle.com/javaee/7/api/javax/batch/runtime/context/StepContext.html 52 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - StepListener とJobRepository StepListener – インターフェース:javax.batch.api.listener.StepListener ステップの開始直前と終了直後のタイミングで、任意のコードを実行させることができます。 以下のメソッドが規定されています。 – beforeStep() • リスナが設置されたステップが実行される直前に実行されるメソッドです。 – afterStep() • リスナが設置されたステップが実行される直後に実行されるメソッドです。 JobRepository – 実行中のジョブの情報や、実行が終わったジョブに関する情報は、ジョブリポジトリに保存されます。jBatch の仕様では、保 存先や保存期間などに関する規定は特にありません。一般的にはコンテナ内部で保持しているデータベースなどに永続化さ れ、アプリケーションサーバーを停止・再起動したあとでも過去の情報をで取得できるようにします。 – jBatch のAPI には、ジョブリポジトリそのものを表現するようなクラスやインターフェースは用意されていません。情報の更新 はコンテナによって自動的に行われ、情報の取得はジョブオペレーター、コンテキスト、メトリックのAPI を利用します。 53 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - バッチ・ステータスと終了ステータス JSR-352では処理結果を表現するものとして、バッチ・ステータスと終了ステータスを提供しています。 概要については 「4.5. ジョブおよびステップのステータス (1/3) - バッチ・ステータス、Exitステータスとは? 」に説明がありますが、ここでは設 定のためのメソッド等について説明します。 バッチ・ステータス – バッチ・ステータスは、コンテナにより自動的に設定される文字列です。設定される値は、 JSR-352の仕様としてあらかじめ定義されています。 – バッチ・ステータスの値はgetBatchStatus() により取得できます。このメソッドはJobContext、JobExecution、StepContext、 StepExecution の各クラスに存在します。いずれのクラスにもsetter メソッドは存在しません。戻り値はEnum 型で、 javax.batch.runtime.BatchStatus として定義されています。 – バッチ・ステータスの値は、STARTING、STARTED、STOPPING、STOPPED、FAILED、COMPLETED、ABANDONED があ ります。(それぞれの説明については、「4.5. ジョブおよびステップのステータス(2/3) - バッチ・ステータス一覧」参照) Exitステータス – 処理結果を詳細に設定することが可能な文字列です。設定しない場合はバッチ・ステータスと同じ文字列がコンテナにより自動的に設定さ れます。 – バッチに対する終了ステータスの設定は、JobContext のsetExitStatus() を用います。ステップに対する終了ステータスの設定は、 StepContext のsetExitStatus() を使います。 54 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - バッチクラスのロード JSR-352では以下3つのローダーを規定しています。記述順にロードが試行されます。 (実際には、WAS Libertyなどのランタイムの実装に依存します。) 1. 実装固有のローダー(implementation-specific loader) – バッチランタイムの実装は、ジョブXML のバッチによる参照クラスの解決とインスタンス化の手段を実装固有の方法とすることが可能です。バ ッチランタイムがバッチクラスをインスタンス化しようとする時、実装固有のメカニズム(が一つでも存在すれば)が最初に試行されます。ロー ダーはインスタンスもしくはnull を必ず返します。 実装固有ローダーはCDI やSpring DI などが挙げられます。 2. アーカイブローダー(archive loader) – 実装固有のメカニズムが存在しないかバッチクラス参照の解決に失敗する(nullを返す)場合、バッチランタイムの実装はアーカイブローダ ーで参照を解決します。ランタイムの実装は、参照名を実装クラス名にマッピングするbatch.xml ファイルを基にして、ルックアップを解決す るアーカイブローダーを提供しています。 3. スレッド・コンテキスト・クラスローダー(thread context class loader) – アーカイブローダーがバッチクラス参照の解決に失敗する(nullを返す)場合、バッチランタイム実装はスレッドコンテキストクラスローダーを通 してクラスの参照を解決してロードします。 55 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - Job XMLのロード Job XMLは、ジョブ開始時のJobOperator.startメソッドの引数として渡します。 指定されたJob XMLファイルは、以下のローダーの順序によって読み込まれます。 1. 実装固有ローダー(implementation-specific loader) – バッチランタイムの実装はJob XML による参照をJob XML ドキュメントに実装固有の手段で提供することが可能です。 – 実装固有ローダーの目的は、リポジトリ・ファイルシステム・リモートキャッシュなどの、アプリケーションアーカイブの外側からXML ロードを可能にするためです。 2. アーカイブ・ローダー(archive loader) – 実装固有メカニズムがJob XML による参照の解決に失敗した場合、バッチランタイム実装はアーカイブローダーで参照を解 決します。実装はMETA-INF/batch-jobs ディレクトリからルックアップして参照を解決するアーカイブローダーを提供します 。 – Job XML ドキュメントは開発者がMETA-INF/batch-jobs ディレクトリ下にアプリケーション(WEBINF/classes/META-INF/batch-jobsの.warファイル)と共にパッケージ化します。 56 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - アプリケーション・パッケージ・モデル jBatch はWeb アプリケーションと同様に、構成するファイル群をwar ファイル形式などにまとめてコンテナにデプロイ します。ファイル形式によってジョブXML は以下のディレクトリーに配置してパッケージする必要があります。 – jar の場合:META-INF/batch-jobs/ – war の場合:WEB-INF/classes/META-INF/batch-jobs/ ジョブXML のファイル名とジョブID は一致させる必要があります。 例:JobA.xmlのフォーマット ・・・・ ジョブXMLのファイル名とジョブIdを一 致させます。 57 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 5.3. ジョブの実装 - クラス一覧 以下はJSR-352ランタイムで提供されているクラスです。 – JobContext – StepContext – Metric – PartitionPlan – BatchRuntime – BatchStatus – JobOperator – JobInstance – JobExecution – StepExecution – Batch Exception Classes 詳細は以下を参照してください。 (参照)JSR_352-v1.0_Rev_a-Maintenance_Release.pdf – 10.9 Supporting Classes – http://download.oracle.com/otn-pub/jcp/batch-1_0_revA-mrel-spec/JSR_352-v1.0_Rev_aMaintenance_Release.pdf?AuthParam=1451183891_d8aab26344cecb4fff10993b245f74ab 58 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6. サンプル・アプリケーション それでは、ここまで解説した内容をベースに、WAS Libertyでサンプルのバッチアプリケーションを作成し、動かしてみます。 6.1. 開発環境について 6.2. 開発の流れ 6.3. 手順解説 59 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.1. 開発環境について まずは、以下の開発環境が準備されていることを確認してください。 前提 – WebSphere Liberty Profile(WLP) が導入済みであること。 – WLP のバージョンは8.5.5.6 以降であること。 – フィーチャー:batchManagement-1.0 が導入済みであること。 – 接続するDB を準備してあること。 60 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.2. 開発の流れ ここからはIBM WebSphere Application Server Liberty Profile (以下WLP) をランタイムとしてWebSphere Developer Tools(以下WDT)を使ったJSR-352バッチアプリケーション開発の一連の流れを紹介します。 WDT はJSR-352 に基づいたバッチアプリケーションを作成するツールを提供しています。当資料では、このバッチプロジェクト作 成のためのツールのセットアップ、バッチプロジェクトの作成、ジョブの作成、WLP へのデプロイ、ジョブの実行、をガイドします。詳 細は次頁からご紹介します。 1. Eclipse とWDT の導入 2. Java batch tools の導入 3. WLP の構成 4. データベース接続の設定 5. バッチプロジェクトの作成 6. ジョブの作成 7. batchletステップの作成 8. デプロイ 9. ジョブの実行 10. ジョブの実行結果 61 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 1. Eclipse とWDT の導入 以下のサイトの手順を参考にEclipseとWDTを導入します。 –http://www.ibm.com/developerworks/jp/websphere/library/was/liberty_intro/1.html 62 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 2. Java batch tools の導入 Eclipse の「Help」 -> 「Install WebSphere Software」をクリックします。「IBM Java EE Batch」の「 Install」をクリックします。ウィザードの指示に従って導入を完了させ、Eclipse を再起動します。 63 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 3. WLP の構成(1) 1. Eclipse のServer ビューを右クリックして「New」 -> 「Server」をクリックして新たにServer を作成します。 2. Select the server type から「WebSphere Application Server Liberty」を選択して、”server runtime environment”がWebSphere Application Server Liberty Profile になっていることをかくに んして「Next」をクリックします。 64 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 3. WLP の構成(2) 3. "Liberty server"を選択して、「Finish」をクリックします。 4. 作成したServer のServer.xml を開き(Server ビューのServer.xml をダブルクリックします)、 batchManagement-1.0 をフィーチャーエレメントに追加します。batch-1.0 は自動的に有効になります。 server.xml 5. Server ビューから作成したWLP を右クリ ックしてServer を開始します。 65 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 4. データベース接続の設定 WLP のバッチフィーチャーが適切に動作するためにはJob Repositoryとして永続ストアが必要です。バッチランタイムは必要な表 を自動作成するので、server.xml に使用するDB を指定する必要があります。DB はサポートされているDBベンダーの中から 選択することができます。(ここで指定したDBがバッチランタイムのJobRepository にあたります。) 1. 2. 当資料では、Derby を使用し、createDatabase="create"に指定することで自動的にデータベースを作成します。 server.xml を開いて、データソース、データストア、バッチパーシスタンスを以下のように設定します。 • Derby database名:${server.config.dir}/resources/BATCHDB • Derby driver (derby.jar):${server.config.dir}/resources/derby • ${server.config.dir}:usr/servers/server_name(デフォルト) server.xml 66 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 5. バッチプロジェクトの作成(1) 1. Eclipse の「File」 -> 「New」 -> 「Project」をクリックします。 2. New Project の「Java EE Batch」 -> 「Java EE Batch Project」 -> 「Next」をクリックします。 67 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 5. バッチプロジェクトの作成(2) 3. New Java EE Project に以下を入力し て「Finish」をクリックします。 – Project Name:sleepybatchlet – Target runtime:WLP – Dynamic web project name: SleepyBatchletSample 4. Workspace にsleepybatchlet プロジェク トが作成されます。 68 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 6. ジョブの作成(1) 1. sleepybatchlet プロジェクトを右クリックして「File」 -> 「New」 -> 「Batch Job」をクリックします。 2. Job Name に”sleepy-batchlet”を入力して「Finish」をクリックします。 69 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 6. ジョブの作成(2) 3. sleepy-batchlet.xml ファイル がsleepybatchlet プロジェクト のMETA-INF/batch-jobs フ ォルダーに新たに作成されます。 4. 自動的にJSL Editor が開きま す。 70 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(1) 1. JSL Editor のJob Node を選択して、「Add」 -> 「Step」 -> 「OK」をクリックします。 71 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(2) 2. ID を「step1」に変更します。 3. 「step」 -> 「Add」を選択して、「Batchlet」を選 択して「OK」をクリックします。 72 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(3) 4. JSL Editor の「Reference」をクリックします。 5. New Batchlet Class に以下を入力して「Finish」 をクリックします。 – – – 73 Java package: com.ibm.ws.jbatch.sample.sleepybatchlet Class name:SleepyBatchlet Batch artifact loading option:デフォルト © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(4)-1 6. 作成したsleepybatchlet.class を開いて以下のソースコードに書き換えます。 package com.ibm.ws.jbatch.sample.sleepybatchlet; import import import import java.util.logging.Logger; javax.batch.api.BatchProperty; javax.batch.api.Batchlet; javax.inject.Inject; public class SleepyBatchlet implements Batchlet { /** * Default constructor. */ public SleepyBatchlet() { // Blank } private final static Logger logger = Logger.getLogger(SleepyBatchlet.class.getName()); ・・・・・ 74 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(4)-2 ・・・・・ /** * Logging helper. */ protected static void log(String method, Object msg) { System.out.println("SleepyBatchlet: " + method + ": " + String.valueOf(msg)); logger.info("SleepyBatchlet: " + method + ": " + String.valueOf(msg)); } /** * This flag gets set if the batchlet is stopped. This will break the batchlet * out of its sleepy loop. */ private boolean stopRequested = false; /** * The total sleep time, in seconds. */ ・・・・・ 75 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(4)-3 ・・・・・ @Inject @BatchProperty(name = "sleep.time.seconds") String sleepTimeSecondsProperty; private int sleepTime_s = 15; /** * Main entry point. */ batchletの処理を実装します。 @Override public String process() throws Exception { log("process", "entry"); if (sleepTimeSecondsProperty != null) { sleepTime_s = Integer.parseInt(sleepTimeSecondsProperty); } log("process", "sleep for: " + sleepTime_s ); int i; for (i = 0; i < sleepTime_s && !stopRequested; ++i) { ・・・・・ 76 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(4)-4 ・・・・・ log("process", "[" + i + "] sleeping for a second..."); Thread.sleep(1 * 1000); } String exitStatus = "SleepyBatchlet:i=" + i + ";stopRequested=" + stopRequested; log("process", "exit. exitStatus: " + exitStatus); return exitStatus; } /** * Called if the batchlet is stopped by the container. */ @Override public void stop() throws Exception { log("stop:", ""); process() の実行中に、ジョブの中断 stopRequested = true; が指示された場合に呼び出されます。 } } 77 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 7. batchletステップの作成(5) 1. JSL Editor の「Batchlet()」 を選択して、「Add」 -> 「properties」 を選択して「OK」をクリックします。 2. JSL Editor の「Properties」 を選択して、「Add」 -> 「property」 を選択して「sleep.time.seconds」を 入力して「OK」をクリックします。Value に” #{jobParameters['sleep.time.seconds']}”を入力して sleepy-batchlet.xml を保存します。 78 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 8. デプロイ 1. Server ビューでWLP を右クリックして「Add and Remove」をクリックします。 2. 「SleepyBatchletSample」を選択して「Add」をクリックします。「Finish」をクリックします。 79 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 9. ジョブの実行(1) 1. server.xml に以下を追加します。server.xml ファイル内で SSL 証明書およびユーザー・レジストリーを作 成して、 batchManagement-1.0 が自動的に SSL フィーチャーを有効にするようにします。 – (参考) http://www01.ibm.com/support/knowledgecenter/SSD28V_8.5.5/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/t wlp_batch_configrest.html server.xml 80 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 9. ジョブの実行(2) 2. Workspace のsleepy-batchlet.xml を右クリックして「Run As」 -> 「Java EE Batch Job」をクリックし ます。 3. Run Configurations に以下を入 力して「Run」をクリックします。 – – – 81 User ID:bob Password:bobpwd Job Parameters • Name:sleep.time.seconds • Value:30 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 6.3. 手順解説 - 10. ジョブの実行結果 前頁の手順でバッチジョブを実行すると、以下のダイアログが出力されます。 ジョブが正常に登録されたことを確認します。ダイアログに"The job "sleepy-batchlet" with ID "1" was submitted successfully." と表示されていればジョブは正常に登録されています。 当資料のjBatch アプリケーションの作成の手順は以下の資料を参考にしています。 – (参考)WASdev:Creating a simple Java batch application using WebSphere Developer Tools – https://developer.ibm.com/wasdev/docs/creating-simple-java-batch-application-using-websphere-developer-tools/ 82 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform 参考資料 JSR-000352 Batch Applications for the JavaTM Platform 1.0, – http://download.oracle.com/otndocs/jcp/batch-1_0_revA-mrel-spec/index.html wasdev:batch タグ アーカイブ – https://developer.ibm.com/wasdev/blog/tag/batch/ Knowledge Center:Liberty プロファイルの Java バッチ・アプリケーションのデプロイ – http://www01.ibm.com/support/knowledgecenter/SSD28V_8.5.5/com.ibm.websphere.wlp.core.doc/ae/twlp _container_batch.html 83 © 2016 IBM Corporation JSR-352 Batch Applications for Java Platform END 84 © 2016 IBM Corporation
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.5 Linearized : No Page Count : 84 Language : ja-JP Tagged PDF : Yes Title : IBM Brand Template Author : IBM_ADMIN Create Date : 2016:05:24 08:09:51+09:00 Modify Date : 2016:05:24 08:09:51+09:00 Producer : Microsoft® PowerPoint® 2013 Creator : Microsoft® PowerPoint® 2013EXIF Metadata provided by EXIF.tools