IBM Brand Java EE7App Guide Batch

User Manual: Pdf

Open the PDF directly: View PDF PDF.
Page Count: 84

© 2016 IBM Corporation
Java EE 7 アプリケーション設計ガイド
日本アイ・ビー・エム システムズ・エンジニアリング株式会社
JSR-352 Batch Applications for Java Platform
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
Disclaimer
この資料は日本アイ・ビー・エム株式会社ならびに日本アイ・ビー・エム システムズ・エンジニアリング株式会社の正式なレビュー
を受けておりません。
当資料は、資料内で説明されている製品の仕様を保証するものではありません。
資料の内容には正確を期するよう注意しておりますが、この資料の内容は201511月現在の情報であり、製品の新しいリ
リース、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の米国およびその他の国における登録商標です。
UNIXThe 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. JSLJob Specification Language
3.1. JSLとは?
3.2. その前に・・・・Listener Properties
3.3. JSLでの変数使用
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. 手順解説
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
企業内には、オンライン処理以外にも多様なワークロード の形態 が存在
実行するタイミングが決まっている定例処理(日次処理、月次処理、期次処理等)
スループットが要求される一方で、即時性は要求されない処理
• (例:売り上げ集計、カード利用料金引き落とし、預金金利決算など)
膨大なCPU時間を要する金融シュミレーションなどの計算集約型処理
Webアプリケーション環境は、オンライン処理以外 が苦手(だった)
クライアント・サーバー型オンライン処理(1リクエスト1応答1同期点処理)
長時間処理に向かない(応答タイムアウトがある)
分散系との混在による運用コストの増大
ホスト系技術者の減少
1.2. Javaバッチ登場の背景と現状の課題
Javaバッチ登場の背景と現状の課
7
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
1.2. Javaバッチ登場の背景と現状の課題
Javaによるバッチ処理実行のために多くの製品やOSSが提供された
IBMからWCGWebSphere Compute Grid
OSSとしてはSpring Batchなど
各社の内製フレームワーク
・標準化の要請
ソフトウェア資産の保護やスキルの共通化
オンライン処理と利用技術の共通化
Java EE 7の策定にあたって新仕様として追加
JSR 352 Batch Applications for the Java Platformとして標準化
「独自フレームワークの群雄割拠Java EEによる標準化
8
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
以下は、典型的なバッチ処理のアーキテクチャーです。
ジョブは複数のステップから構成されます。
ステップは1つのItemReaderItemProcessorItemWriterを持ちます。
ジョブは、JobOperator によって起動されます。
ジョブの実行状況は、JobRepositoryに格納されます。
次章にて、これらのコンポーネントの詳細について説明します。
1.3. JSR352におけるバッチ処理
JobOperator Job Step
ItemReader
ItemProcessor
ItemWriter
1n1
1
1 1
1
1
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
JobInstance
JobExecution
例えば・・・日次のジョブ
例えば・・・2015/10/06 のジョブ
例えば・・・2015/10/06 のジョブ、1回目の試行
Job」は、バッチ全体のプロセスをまとめたエンティティです。
Jobは、1つあるいは複数の「Step」をまとめたもので、「Stepの制御情報や、各「Step」に
共通のプロパティー設定などを行います。Jobには、再起動処理の可否も設定します。
JobInstance」は、Jobの実行単位に相当します。例えば日次でのジョブの場合、
2015/10/06 のジョブ、などに相当します。
JobExecutionJob実行の1試行に相当します。再処理などで実行した場合、それは
同じJobInstanceの異なるJobExecution、ということになります。また、ジョブの起動・再
起動時には、「JobParamter」を指定することができます。
11
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
2.2. Step
Job
JobInstance
JobExecution
Step
StepExecution
Step」は、ジョブを構成する処理をまとめたオブジェクトです。よっ
て、ジョブは1つ以上のステップで構成されることになります。バッチ
処理の実行・制御に必要な情報を含んでいます。
StepExecution」は、Stepの実行の1試行に相当します。
StepExecutionは、Stepが実行された際に実際に生成されま
す。前Stepの実行が失敗してStepが実行されなかった、などの
場合は生成されません。
12
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
2.3. その他コンポーネント
JobOperator Job Step
ItemReader
ItemProcessor
ItemWriter
1n1
1
1 1
1
1
JobRepository
JobOperator」は、ジョブの処理に関連する、起動、停止などの操作
コマンドや、リポジトリの操作など、全ての管理的なインターフェースとなるコ
ンポーネントです。
JobRepository」は、実行中、および過去に処理したジョブの履歴
を保持するコンポーネントです。 JobOperatorを介してリポジトリの操作
を行います。 JobRepositoryには、JobInstanceJobExecution
StepExecutionが含まれます。
ItemReader」は、Stepへの入力とな
るデータの取得を担います。入力データが
枯渇した場合はその旨をStepへ伝えます。
ItemProcessor」は、データの処理を
担います。 ItemReaderが取得したデー
タの変換やビジネスロジックの実行を行い、
出力をItemWriterに渡します。
ItemWriter」は、Stepからのデータの
出力を扱います。次に行う処理などには
関与せず、渡されたデータのみを扱います。
13
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
3. JSLJob Specification Language
JSLはジョブ、ステップ、およびそれらの実行を規定します。
JSR-352では、JSLXMLで記述します。よって、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. JSLJob Specification Language)は、ジョブおよびステップの設定、およびジョブの処理内容の制御を
規定するためのXMLファイルです。
2. 各設定要素の包含関係は大まかには以下のような構造となっています。次章で各構成要素の設定・構成の
細を解説します。
job
reader
processor
writer
batchlet
split
flow
decision
partition
partition
step
Chunk
実行要素
Execution elements
その他、JSR-352 では以下の説明があります。これらについ
ても、構成要素の説明の中に散りばめて説明します。
遷移要素(Transition elements
4.3. Jobの処理順序制御 (1/2
バッチ・ステータス、Exitステータス
4.5. ジョブおよびステップのステータス (1/3) - バッチ・ステータ
ス、Exitステータスとは?
Job XMLでの変数使用
3.3. Job XMLでの変数使用
:エレメント
:属性
以降、エレメントと属性を以下のように現すこととします。
15
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
3.2. その前に・・・・Listener Properties
1. Listener Properties
これらは、Job XML内の各設定箇所で度々出てきますので、先立って説明します。
Listenerは、それぞれの設定項目の範囲で個別に設定が可能なもので、カスタムで自作したコードを呼び出すための拡張として用い
事ができます。
Propertiesは、これらのListenerとして定義されたアーティファクトに、プロパティーとして渡す情報を定義するために使用されます。
2. 役割
Listener
• ステップ実行の様々なフェーズをインターセプトするリスナー・アーティファクトを定義します。
chunk型のStepでは、リスナーのバッチ・アーティファクトは以下のインターフェースを実装します。
StepListener, ItemReadListener, ItemProcessListener, ItemWriteListener, ChunkListener, RetryReadListener, RetryProcessListener,
RetryWriteListener, SkipReadListener, SkipProcessListener, SkipWriteListener.
Propertities
• バッチ・アーティファクトがバッチ・コンテキスト・オブジェクトを使用して取得できる、プロパティーの組み合わせを定義します。
listeners properties
listerner property
16
© 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. job
4.2. step
4.3. ジョブの処理順序制御
4.4. 実行要素
4.5. ジョブおよびステップのステータス
18
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.1. job -設定項目
1. ジョブ定義は、最も粒度の大きい要素になります。
2. StepFlowSplitDecision の実行要素を子要素として持ちま
す。(詳細については後述)
3. listenerspropertiesの定義が可能
1. P16 で説明した listeners で処理をインターセプトして実行するアーテ
ファクトの定義が可能です。
2. ジョブ・レベルのプロパティーでは、ジョブ・コンテキスト全体で取得可能なプ
ロパティーの設定が可能です。
job
id
restartable
listeners
properties
step
flow
split
decision
項目 説明
id
ジョブの論理名を指定します。ジョブの識別に使用されます。
XML
String
属性の規約に従う必要があります。必須項目です。
restartable
このジョブが再始動可能か否かを
true/false 指定します。オプ
ショナルです。デフォルトは
true です。
19
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.2. step - stepの属性情報、実行タイプ
job
step
id
start-limit
allow-start-if-complete
next
chunk
batchlet
listeners
properties
partition
next
stop
end
fail
1. ステップは、ジョブ実行時の最小単位です。属性として以下を持ちます
2. ステップの実行タイプは、以下の2種類があります。
1. chunkChunk指向型処理)」
2. batchlet(タスク指向型処理)」
項目 説明
id
ステップの論理名を指定します。ジョの識別に使用されます。
XML
String属性の規約に従う必要があります。必須項目です。
start
-limit
このステップの起動、再起動で許容される試行回数を指定します。
デフォルトは
0で、無制限を意味します。この回数以上の試行がなさ
れた場合はステップは
FAILEDで終了します。
allow
-start-if-
complete
ジョブの再実行時に、(例え前回の試行が正常終了していたとして
も)このステップの再処理を行うか否かを
true / false で指定しま
す。
true の場合実行します。デフォルトは false です。
next
このステップの終了後に行う次の実行要素を指定します。
step
flow
splitdecision のいずれかを指定しますLoopが発生する
ような定義はできません。
20
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
JSR-352では、バッチの処理形態として、「chunkchunk向型処理)」と「batchlet(タスク指向型処理)」を扱います。中でも、
chunkパターンを基本の処理としています。chunkターンでは、データを1回につき1 Item取得(ItemReader)し、処理(
ItemProcessor)したうえでchunk(データの塊)として出力(ItemWriter)します。出力は、指定した条件(データの個数もしくは時
間)に合致しときにまとめてコミットされます。
以下は、この振る舞いをシーケンスで模式的に表したものです。
4.2. step - chunkChunk指向型処理)の詳細 (1/2)
Step ItemReader ItemProcessor ItemWriter
execute()
ExitStatus
read()
item process(item)
item
read()
item
process(item)
item
write(item)
write(コミット)はまとめて実施
繰り返し
21
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.2. step - chunkChunk指向型処理)の詳細 (2/2)
job
step
chunk
checkpoint-policy
item-count
time-limit
skip-limit
retry-limit
続く
1. chunkは 属性として以下を持ちます。
2. これらには、作成したアーティファクトを指定します。
項目 説明
checkpoint
-policy
コミットの振る舞いを規定するチェックポイントのポリシーを
"item"もしくは
"commit"
で指定します。itemを指定した場合は一定数の処理後にチェックポ
イントを取得します。
custom指定の場合は、別途指定するcheckpoint-
algorithm
の実装に応じてチェックポイントを取得します。デフォルトはitem
です。
item
-count
ポリシーが
itemの場合に、チェックポイントを取得するchunkに含まれitem
を指定します。デフォルトは
10です。
time
-limit
ポリシーが
itemの場合に、チェックポイントを取得する間隔を秒数で指定します。
デフォルトは
0で、無制限(すなわち、時間間隔では取得しない)です。item-
count
time-limit両方が指定されている場合は、最初にいずれかの条件に
合致した時点でチェックポイントが取得されます。
skip
-limit
スキップ対象として定義した例外が、何回発生したらステップをスキップするか、と
いう回数の定義を行います。デフォルト無制限です。
retry
-limit
リトライ対象として定義した例外が、何回発生したらステップを処理をリトライする
か、という回数の定義を行います。デフォルト無制限です。
reader
ref
processor
ref
processor
ref
checkpoint-algorithm
ref
properties
項目 説明
ref
それぞれの項目に対応するアーティファクトを指定します。
22
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
チェックポイント機能とは、バッチが障害などの理由で途中停止した場合に備えて指定タイミングで定期的にコミットを取り、その
進捗を記録することで、回復時に再実行可能な状態にしておく機能です。リスタート機能はチェックポイントの情報を読み取り、
再実行された際に最後にコミットしたレコードの次の行からの処理を行う機能です。
チェックポイント取得のインターバル、頻度は、システム全体のパフォーマンスに大きく影響するため、チューニングは非常に重要で
す。
参考】 チェックポイント
更新
更新
更新
更新
更新
更新
更新
更新
更新
更新
更新
更新
更新
UOW
再実行時は
ここから再開
更新
更新
更新
チェックポイント取得
ロールバック
障害発生
23
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
ステップ実行中に例外が発生した場合は・・・デフォルトでは、Exitステータス:FAILEDで終了します。
しかし・・・reader / processor / writer にたいして、予め特定の例外を定義しておくことで、スキップ /リトライを設定できま
す。
スキップ
chunkの子エレメントとして、スキップ対象とする例外クラスを指定
リトライ
• 同じくchunkの子エレメントとして、リトライ対象とする例外クラスを指定
• デフォルトのリトライの振る舞いとしてはchunkロールバックて、(デフォルトの)チェックポイント・アルゴリズムに基づいてitem-
count1から再開
• オプションのchunk Listenerstepに対して設定されている場合は、ロールバックの前にonErrorメソッドが呼ばれ
• リトライ時にロールバックしない方法指定可能
retryable-exception-classesno-rollback-exception-classes、両方に同一の例外が指定がされている場合、その例外発生時にロール
バックはされません。
但し・・・・・
同じ例外がスキップ/リトライの両方で指定されていた場合は、リトライが優先されます。
リトライの実行中に、リトライ発生のトリガとなった例外と同じ例外が再度発生した場合、そのステップはスキップされます。
設定方法については次ページを参照ください。
4.2. step - chunkchunk指向型処理)の詳細 -例外発生時の対応(1/2)
24
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.2. step - chunkchunk指向型処理)の詳細 -例外発生時の対応(2/2)
job
Step
chunk
skippable-exception-classes
include class
exclude class
retryable-exception-classes
include class
exclude class
no-rollback-exception-classes
include class
exclude class
properties
1. chunkの例外発生時対応のエレメントとして以下を持ちます。
skippable-exception-classes
• 前頁記述のとおり、スキップ対象とする例外、スキップ対象としない例外を指定します。
retryable-exception-classes
• 前頁記述のとおり、リトライ対象とする例外、リトライ対象としない例外を指定します。
no-rollback-exception-classes
• リトライ対象として指定されている例外のうち、(デフォルトの振る舞いであるロールバッ
ク後のリトライをオーバーライドして)ロールバックせずにリトライを行う対象の例外、対
象外の例外を指定します。
2. それぞれのクラス指定では、以下の属性を持ちます。
項目 説明
include
class
対象とする例外クラスもしくは例外のスーパークラスを指定します。複数指定可
能です。
exclude
class
対象から除外する例外クラスもしくは例外のスーパークラスを指定します。複数
指定可能です。
25
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.2. step - batchletbatchlet指向型処理)の詳細
job
Step
batchlet
properties
ref
1. batchlet型は、chunk型と比較してよりシンプルな処理形態です。
2. chunk型のような読み込み、処理、書き込み、の一連の流れではな
く、ファイル転送や印刷、コマンド実行、などのタスク型の処理に適して
います。
3. batchletの設定は非常にシンプルで、実行対象となるアーティファクト
を指定し、必要に応じてプロパティーの設定をするのみです。以下の
様な指定を行います。
4. batchletインターフェースの詳細は、「5.3. ジョブの実装 - batchlet
方式ステップの実装」 を参照ください。
項目 説明
ref
Batchlet
として実行するアーティファクトを指定します。
26
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.2. step - stepのパーティショニング(1/4
バッチステップは、パーティション化により複数のインスタンスに処理を分割して並行処理させる事ができます。
パーティションの分割につい
• パーティション化されたステップは複数のインスタンスで実行されます。
• スレッドおよびパーティションの数は、パーティション・マッパーからの呼び出し、もしくは、JSL内(partition下のplanエレメント)で指定
します。
• 各パーティションには、どの範囲のデータを扱えばよいのか、というパラメーターを渡す必要があります。
• 各スレッドはそれぞれ独立したコピーのステップとして動作します。よって、チェックポイント取得なども各パーティションでそれぞれ独立し
行われます。
• パーティション・リデューサーで、各パーティションの結果を統合・協調させることができるので、どこかでエラーが発生した場合に全体をバッ
クアウトをさせる、という様なことも可能です
各パーティションの処理結果の統合について
• 各パーティションの実行結果は、全体のステップの結果としてどうだったか判定する必要があります。
PartitionCollectorPartitionAnalyzer がこの結果判定を担います。
27
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.2. step - stepのパーティショニング(2/4
stepのパーティショニング
Partition Mapper(パーティション・マッパー)
• パーティション数とスレッド数を計算するプログラムをパーティション・マッパーとして定義できます。
• また、パーティション・マッパーは、各パーティションで参照するプロパティーも指定できます。
• 機能的に重複しますので、パーティション・プランを設定した場合はPartition Mapperは使用できません。
Partition Reducer(パーティション・リデューサー)
• パーティション処理において、UOWUnit 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
step
partition
plan
partitions
properties
threads
1. plan では、パーティション化されたstepの実行に関わる設定を行いま
す。設定項目は以下のとおりです。
2. また、各パーティションそれぞれに対してプロパティーを設定することがで
きるようになっています。これを利用して、例えばパーティション毎に異な
る処理対象ファイルを指定したり、処理対象のデータ範囲を指定した
りすることができる様になります。
項目 説明
partitions
パーティション化されたステップのパーティションの数を指定します。オプショナルな
属性で、デフォルトは
1です。
threads
ステップが実行するスレッド数の最大値を指定します。
JSR-352
の仕様としては、
要求された実行スレッド数でのステップ実行を保証するわけではない、としていま
す。オプショナルな属性で、デフォルト値は
partitionsで指定されたパーティショ
数です。
partition
name
value
項目 説明
partition
プロパティーを適用する、
0から始まるパーティション番号を指定します。
name
プロパティー名を指定します。
value
name
に対応するプロパティー値を指定します。
29
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.2. step - stepのパーティショニング(4/4
job
step
partition
mapper
ref
properties
reducer
ref
properties
collector
ref
properties
analyzer
ref
properties
1. 4.2. step - stepのパーティショニング(1/4」で説明した、パー
ティション化された処理を担う各コンポーネントの設定は、以下のように
行います。
2. また、propertiesエレメントとして、各バッチ・アーティファクトに渡すプロ
パティー情報を以下の様に設定します。
項目 説明
ref
パーティション化されたステップのパーティションの数を指定します。オプショナルな
属性で、デフォルトは
1です。
項目 説明
name
各バッチ・アーティファクトに渡すプロパティー名を指定します。
value
各プロパティーに対応する値を指定します。
30
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.3. Jobの処理順序制御 (1/2
実行要素(execution element)と遷移要素(transition element
ジョブの処理の流れは、実行要素のスコープ内で定義される遷移要素に応じて、次に実行する実行要素を指定するか、次
のジョブ実行を終了させるかを定義することで行います。
つまり、実行要素の結果に応じて、次にこの実行要素を実行する、ジョブを終了させる、などの遷移要素の設定を行って制
御することになります。
実行要素
step / flow / split /decision があります。詳細は次ページ以降で解説します。
遷移要素
以下の要素があります。詳細は次ページで解説します。
next エレメント
fail エレメント
end エレメント
stop エレメント
31
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.3. Jobの処理順序制御 (2/2
next エレメント
指定された、次の実行要素を実行します
fail エレメント
ジョブを、FAILEDのバッチ・ステータスで終了させます。
end エレメント
ジョブを、COMPLETEDのバッチ・ステータスで終了させます。
stop エレメント
ジョブを、STOPPEDのバッチ・ステータスで終了させます。
併せて、ジョブがリスタートされた際に実行するジョブ・レベルでstepflow
splitを指定します。
32
job
step
next
stop
end
fail
on
exit-status
restart
on
exit-status
on
exit-status
on
to
項目 説明
on
(必須)
next, fail, end, stop で共通)Exitステータス値を指定します。"*"0
以上の文字列の合致)と、
"?"1文字の合致)を使用できます。
to
(必須)
next のみ)適用された場合に次に遷移する実行要素のidを指定します。
exit
-status
(任意)
fail, end, stop のみ)指定した値でジョブに新しExitステータスをセットし
ます。指定しなかった場合は更新されません。
restart
(任意)
stop のみ)ジョブの再始動時に再始動の対象となるジョブ・レベルのstep
flow
splitを指定します。
32
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.4. 実行要素 - flow
flowは、1つの単位内で実行する、実行要素の順序制御を定義るものです。
flowは、stepsplitdecision、もしくは別のflow に遷移できます。
また、flowは、その処理単位内にstepflowdecisionsplitを定義する事ができます。
flow
step flowdecision split
step
flow
decision
split
flowは、内部で更にstepflowdecisionsplitを定義する事が
できます。
FAILED COMPLETED STOPPED
flowの実行結果および定義した遷移要素に応じて次にどのようなス
テータス、処理をとるかが決定されます。
flow
flow内部で定義されている実行要素は、同じflow
の実行要素にのみ遷移できます。それ自身が定義され
ているflow外の実行要素へは遷移できません
next fail end stop
Syntax;
<flow id="{name}" next="{flow-id | step-id | split-id | decision-id}">
<step> ... </step>
...
</flow>
ジョブ終了
33
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.4. 実行要素 - split
splitは、同時に処理するflowを定義するために使用されます。
splitは、flowのみを子エレメントとして持つことができます。各子flowは異なるスレッドで実行されます。
splitの子エレメントとして定義された全てのflowの実行が終了した段階で、splitの処理が完了します。
splitの次は、stepflowdecision、もしくは他のsplitに遷移できます。
34
split
flow
step
flow
decision
split
splitの内部(並行して処理する実行要素)には、
flowのみを定義する事ができます。
定義されたflowは別スレッドで並行して処理されます
next
Syntax;
<split id="{name}"next="{flow-id | step-id | split-id | decision-id}">
<flow> ... </flow>
...
</split>
flow ・・・・
splitの後続処理として、stepflowdecision、もしくは他のsplit
の何れかを指定できます。
34
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.4. 実行要素 - decision
decisionを用いることで、順次処理で次に行うべき処理の判断をカスタマイズすることが可能です。
decisionは、stepflowsplitもしくは他のdecisionnextレメントのターゲットとして指定します。
decisionとして、判断のロジックをもつアーティファクトを指定する必要があります。
decisionでは、判断の根拠にstopfailendnext エレメントを使うことができます。
戻り値は、現在のジョブのexit statusにもセットされることになります。
decisionの例外処理
deciderdecisionに登録されたアーティファクト)で例外が発生すると、バッチFAILEDのステータスで終了します。
Syntax;
<decision id="{name}" ref="{ref-name}">
指定例:
<decision id="AfterFlow1" ref="MyDecider">
...
</decision>
step flow decision split
decision
next
step
flow
decision
split
FAILED COMPLETED STOPPED
next
fail end stop
ジョブ終了
next
next next
stepflowsplitもしくは他のdecisionから遷移できます。
判断ロジックを記述したアーティファクトを定義します。
処理結果から、遷移要素を決定します。
35
© 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
• ジョブ・レベルの実行エレメント(stepflowsplit)が、next指定なし、もしくtransitionエレメントでの指定ステータス以外で終了した場合、ジョブは
COMPLETEDに設定されます。
スーテタス:FAILED
stepがランタイムに、skipもしくはretry対象とならない例外をスローした場合、ジョブはFAILED設定されます。
• また、パーティション化された、もしくは同時実行(split)されたステップが処理中の場合、それら実行中のインスタンスは継続して処理を行いますが、最終的
にはFAILEDで終了します。
ステータス:STOPPEDCOMPLETEDFAILED
stepflowdicisionstopendfailエレメントで終了した場合、ジョブは、それぞSTOPPEDCOMPLETEDFAILEDで終了します。
36
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
以下はバッチ・ステータスの一覧です。
ステータス 説明
STARTING
JobOperator
のスタートおよびリスタートの操作によって、バッチジョブがランタイムに渡された状態です。
実際にジョブが実行される前にこの状態になります。
STARTED
ランタイムによってバッチジョブの処理が開始された状態です。処理が開始されるとこの状態になります。
STOPPING
JobOperator
のストップもしくは、JSL<stop>
エレメントによって、ジョブの停止が要求されている状態
です。
JobOperatorが停止要求を受けるとすぐにこの状態になります。
STOPPED
JobOperator
のストップもしくは、JSL<stop>
エレメントによる停止要求によって、ジョブが停止した状
態です。ランタイムによってジョブが停止された後にこの状態になります。
FAILED
バッチジョブが解決されない例外もしくは
JSL<fail>エレメントによって、停止された場合にこの状態に
なります。
COMPLETED
バッチジョブが正常終了、もしくは
<end>エレメントによって停止した場合にこの状態になります。
ABANDONED
JobOperator
abandon操作によってマークされるとこの状態になります。abandon(破棄)された
ジョブは、処理も再処理もできませんが、履歴としては残ることになります。
4.5. ジョブおよびステップのステータス(2/3) -バッチ・ステータス一覧
37
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
4.5. ジョブおよびステップのステータス(3/3) -ステータス遷移例・イメージ
job
Step 1
Step 2-1
Step 2-2
Step 3
COMPLETED
Exit
コード?
以下は、ジョブおよびステップのステータス遷移の模式的にあらわした図です。(厳密なタイミングについては前頁の説明を参照ください。)
ここでは、赤字でジョブのバッチ・ステータス青字でステップのExitステータス表しています。Exitステータスはステップのフロー制御で使用されています。
RC1
RC2
FAILED
その他
指定例:
<step id="step1" >
<fail on="FAILED" />
<next on="RC1" to="Step2-1" />
<next on="RC2" to="Step2-2" />
</step>
<step id="step2-1" >
<fail on="FAILED" />
<next on="RC3" to="Step3" />
<stop on="RC4" />
</step>
<step id="step2-2" >
<fail on="FAILED" />
<next on="*" to="Step3" />
</step>
<step id="step3" >
<fail on="FAILED" />
</step>
Exit
コード?
STARTING
STOPPED
RC3
STARTED
STOPPING RC4
38
© 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
jBatchRuntime
5.1. JSR-352におけるバッチ処理のランタイム
JobOperator
Job
Step
ItemReader ItemProcessor ItemWriter
JobRepository
EJB/JAX-RS/Servlet
JSR-352のバッチランタイムは、ジョブXML による処理の順序制御、チェックポイントによるレコード単位のコミット、
スキップ処理などの実行環境を提供しています。ジョブ、ステップの単位でプロパティーをサポートしています。
バッチ・システムを作るためのAPI の提供に主眼を置いているため、JAX-RS JSF などからJobOperator を呼
び出してジョブを実行します。
JSR-352のバッチランタイムが提供するプロパティー名の接頭辞にはjavax.batch が規定されています。
Step Batchlet
Listener Context Metric
Job.xml
CSV/XML/JSON/JD
BC/JPA
CSV/XML/JSON/J
DBC/JPA
40
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
ジョブの開始や停止などの全体的な制御には、ジョブオペレーターを利用します。
インターフェース:javax.batch.operation.JobOperator
JobOperator インタフェースは、jobの開始・停止・リスタート・検査するための操作セットです。
JSR-352には、ジョブオペレーターの呼び出し方に関する規定はありません。そのため、ジョブオペレーターを呼び出
すコードが含まれるクラスを作成し、それをJAX-RSJSFEJBなどで実行します。また、jBatch の仕様にはバッ
を決まった時間に起動する方式や、それを実行するAPI も含まれていません。cronやタスクスケジューラーなどのジ
ョブスケジューラーと連携させて使用します。
5.2. ジョブの管理 -ジョブオペレーター
Application Server
(Java EE コンテナ)
JSF
jBatch コンテナ
CDI
JAX-RS
jobOperator
.start()
.stop()
.restart()
ブラウザなどから
直接実行
EJB
ジョブスケジューラ Shell Script
.bat ファイル
ジョブオペレーターの呼び出しの例
41
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
ジョブの実行はジョブオペレーターが提供するメソッドを利用します。JobOperator には、start()stop()
restart() などのメソッドが含まれています。JobOperator インターフェースは、BatchRuntime クラスの
getJobOperator() メソッド経由でコンテナから取得します。
ジョブの開始は、ジョブXML を指定して起動します。start() の第一引数はJobId( Job.xml )を、第二引数
にはジョブのプロパティーを指定します。ここで指定したプロパティーは、Job.xml の中やジョブを構成するクラスの中
で取得可能です。返り値はジョブを実行すると割り振られるJobExecution Id です。
5.2. ジョブの管理 -ジョブの開始
Properties p = new Properties();
・・・
JobOperator jobOperator = BatchRuntime.getJobOperator();
//start
long jobExecId = jobOperator.start("JobSample" , p);
ジョブ実行の例
Job.xml 名とジョブプロパティーを引数にし
て起動します。ジョブの実行は
BatchRuntimeを介して行います。
<?xml version="1.0" encoding="UTF-8"?>
<job id="JobSample"
・・・・
</job>
JobSample.xml
Job.xml の配置については、「5.3. ジョブの実装 -
Job XMLのロード」を参照ください
42
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
最初にジョブを実行するとコンテナ内部でJobInstance JobExecution が生成されます。その際に、それぞ
れにId が割り振られます。 JobInstance はジョブの1回分を、 JobExecution は実行そのものを表しています。
以下のId でジョブランタイムを定義します。instanceId, executionId, stepExecutionId は、ジョブリポジトリ
内で一意の値である必要があります。
5.2. ジョブの管理 -ジョブランタイムId
Id
説明
instanceId
ジョブのインスタンスを表す
Idです。新しいジョブインスタンスは、バッチランタイムかJobOperator を取得し、
start
メソッドを呼び出して開始することができます
executionId
特定のジョブインスタンスを実行する際に使用す
Id です。ジョブのリスタート、停止時に引数に指定します。
JobOperator
を取得してrestartstop メソッドを呼び出します。
stepExecutionId
ジョブの中で特定のステップを実行する
Idです。
・・・
//stop
long jobExecId = jobOperator.stop( execId );
//restart
long jobExecId = jobOperator.restart( execId , p);
ジョブの実行例(停止・再起動) executionId を指定してジョブを停止
します。 executionId start 実行
時の返り値です。
executionId とジョブプロパティーを引
数にして再起動します。
43
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
JobInstanceId JobExecutionId
1 1
2 2
2 3
5.2. ジョブの管理 - JobInstance JobExecution の関係
JobA.xml
jobOpertor.start("JobA , p")
jobOpertor.start("JobA , p")
jobOpertor.restart("2 , p")
再開対象のJobExecutionId
指定します。
再実行の際にJobExecutionId
を指定します。
中断対象のJobExecutionId
を指定します。
jobOperator.stop(2);
もしくはエラー等による中断
完了
完了
ジョブがエラーにより中断したり、stop() により明示的に中断が指示された場合は、そのジョブに対してrestart()
を指示することができます。この場合、再開前のJobInstance に対して、別のJobExecution のインスタンスが
生成されます。そのJobExecution には新たなJobExecutionId が生成されます。こうした各ジョブの状態や履
歴に関する情報はジョブリポジトリに保存されます。JobOperator stop() restart() を実行するときの引数
には、JobExecutionId を指定します。
44
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
5.3. ジョブの実装 - jBatchのランタイム インターフェース
次頁から以下4つのインターフェースについて記載します。
chunk方式ステップ
ItemReaderItemProcessorItemWriter
batchlet方式ステップ
batchlet
jBatchRuntime
JobOperator
Job
Step
<<interface>>
ItemReader <<interface>>
ItemProcessor <<interface>>
ItemWriter
JobRepository
EJB/JAX-RS/Servlet
Step <<interface>>
batchlet
Listener Context Metric
Job.xml
CSV/XML/JSON/JD
BC/JPA
CSV/XML/JSON/J
DBC/JPA
45
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
ItemReader
インターフェース:javax.batch.api.chunk.ItemReader
ItemReader chunk型ステップで加工や計算を行うための情報をデータベースやファイルなどから読み込みます。
以下のメソッドが規定されています。
open()
• 情報が格納されているリソースを開く処理を実装するためのメソッドです。
• 引数にはチェックポイントの情報を指定します。
close()
open() でアクセスしたリソースを閉じる処理を実装するためのメソッドです。
readItem()
open() で開いたリソースからレコードを1件ずつ読み取る処理を実装するためのメソッドです。引数はなく、戻り値は
Object 型です。この戻り値がそのままItemProcessor に渡されます。読み取るレコードがなくなったとき、戻り値null
を返し、ItemProcessor にレコードが渡されなくなります。
checkpointInfo()
• 「5.3. ジョブの実装 - chunk方式ステップの実装 ItemWriter」 参照
5.3. ジョブの実装 - chunk方式ステップの実装 ItemReader
46
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
ItemProcessor
インターフェース:javax.batch.api.chunk.ItemProcessor
ItemReader で読み込まれた情報を1件ずつ受け取り、加工や計算などの処理をする役割を担います。
以下のメソッドのみが規定されています。
processItem()
• 引数には、ItemReader readItem() で戻り値として設定された情報が格納されます。
processItem() の戻り値はItemWriter writeItem() に渡す情報です。
• チェックポイントが実行されるまでprocessItem() の戻り値はアプリケーションサーバーの中で保持されています。仮に前
回のチェックポイントから数件を処理した後、次のチェックポイントをむかえる前にハンドリング不可能なエラーが発生した場
合、トランザクションはロールバックされて内部的に保持していた情報はクリアされます。
• 再実行した場合は、前回のチェックポイント時点(ItemReader checkPointInfo() で記録された時点)から再
開されるため、クリアされても問題はありません。
5.3. ジョブの実装 - chunk方式ステップの実装 ItemProcessor
47
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
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() の引数にその値がセットされます。
5.3. ジョブの実装 - chunk方式ステップの実装 ItemWriter
48
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
Batchlet
インターフェース:javax.batch.api.Batchlet
以下のメソッドが規定されています。
process()
batchletが担う機能を実装するためのメソッドです。引数はなく、戻り値はString 型です。
• 戻り値に指定した文字列は、このステップの終了ステータスとしてコンテナに解釈されます。
stop()
batchletの処理中に(process() の実行中)に、ジョブ全体の中断が指示された場合に呼び出されるメソッドです。
• このメソッドは、process() を実行しているスレッドとは別のスレッドで実行されているため、process() の処理に直接
割り込むことはできません。
• 注意点として、ジョブ全体の中断が指示されても、process() の処理が中断されない場合もあります。JobOperator
クラスのstop() メソッドにより指示します。
5.3. ジョブの実装 - batchlet方式ステップの実装
49
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
メトリックchunk型のステップに対して実行時の統計情報を提供します。
インターフェース:javax.batch.runtime.Metric
提供される情報は読み取りレコード数、書き込みレコード数、スキップが発生した数など、処理量に関するものです。
以下のようなメトリックを提供しています。これらのメトリックはStepExecution クラスから呼び出します。
インターフェース:javax.batch.runtime.StepExecution
5.3. ジョブの実装 -ジョブメトリック
メトリック
説明
readCount
読み取りが成功したレコード数
writeCount
書き込みが成功したレコード数
filterCount
データの加工などの処理をしたレコード数
commitCount
トランザクションのコミットしたレコード数
rollbackCount
トランザクションのロールバックしたレコード数
readSkipCount
読み取り時にスキップが発生したレコード数
processSkipCount
データの加工などの処理時にスキップが発生したレコード数
writeSkipCount
書き込み時にスキップが発生したレコード数
50
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
JobContext
インターフェース:javax.batch.runtime.context.JobContext
現在のジョブ全体に関する情報を提供する役割を担います。必要に応じて任意の値(UserData)をセットすることもできます。
JobContext のインスタンスは右記のように定義することでコンテナによってインジェクトされます。
以下はJobContext インターフェースが持つメソッドです。詳細はJavaDoc を参照してください。
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
5.3. ジョブの実装 - JobContext
@Inject
private JobContext jctx ;
51
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
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
5.3. ジョブの実装 - StepContext
52
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
StepListener
インターフェース:javax.batch.api.listener.StepListener
ステップの開始直前と終了直後のタイミングで、任意のコードを実行させることができます。
以下のメソッドが規定されています。
beforeStep()
• リスナが設置されたステップが実行される直前に実行されるメソッドです。
afterStep()
• リスナが設置されたステップが実行される直後に実行されるメソッドです。
JobRepository
実行中のジョブの情報や、実行が終わったジョブに関する情報は、ジョブリポジトリに保存されます。jBatch の仕様では、保
存先や保存期間などに関する規定は特にありません。一般的にはコンテナ内部で保持しているデータベースなどに永続化さ
れ、アプリケーションサーバーを停止・再起動したあとでも過去の情報をで取得できるようにします。
jBatch API には、ジョブリポジトリそのものを表現するようなクラスやインターフェースは用意されていません。情報の更新
はコンテナによって自動的に行われ、情報の取得はジョブオペレーター、コンテキスト、メトリックのAPI を利用します。
5.3. ジョブの実装 - StepListener JobRepository
53
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
JSR-352では処理結果を表現するものとして、バッチ・ステータスと終了ステータスを提供しています。
概要については 「4.5. ジョブおよびステップのステータス (1/3) - バッチ・ステータス、Exitステータスとは? 」に説明がありますが、ここでは設
定のためのメソッド等について説明します。
バッチ・ステータス
バッチ・ステータスは、コンテナにより自動的に設定される文字列です。設定される値は、 JSR-352の仕様としてあらかじめ定義されています。
バッチ・ステータスの値はgetBatchStatus() により取得できます。このメソッドはJobContextJobExecutionStepContext
StepExecution の各クラスに存在します。いずれのクラスにもsetter メソッドは存在しません。戻り値はEnum 型で、
javax.batch.runtime.BatchStatus として定義されています
バッチ・ステータスの値は、STARTINGSTARTEDSTOPPINGSTOPPEDFAILEDCOMPLETEDABANDONED があ
ります。(それぞれの説明については、「4.5. ジョブおよびステップのステータス(2/3) - バッチ・ステータス一覧」参照)
Exitステータス
処理結果を詳細に設定することが可能な文字列です。設定しない場合はバッチ・ステータスと同じ文字列がコンテナにより自動的に設定さ
れます。
バッチに対する終了ステータスの設定は、JobContext setExitStatus() を用います。ステップに対する終了ステータスの設定は、
StepContext setExitStatus() を使います。
5.3. ジョブの実装 -バッチ・ステータスと終了ステータス
54
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
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返す)場合、バッチランタイム実装はスレッドコンテキストクラスローダーを通
してクラスの参照を解決してロードします。
5.3. ジョブの実装 -バッチクラスのロード
55
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
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 ディレクトリ下にアプリケーション(WEB-
INF/classes/META-INF/batch-jobs.warファイル)と共にパッケージ化します。
5.3. ジョブの実装 - Job XMLのロード
56
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
jBatch Web アプリケーションと同様に、構成するファイル群をwar ファイル形式などにまとめてコンテナにデプロイ
します。ファイル形式によってジョブXML は以下のディレクトリーに配置してパッケージする必要があります。
jar の場合:META-INF/batch-jobs/
war の場合:WEB-INF/classes/META-INF/batch-jobs/
ジョブXML のファイル名とジョブID は一致させる必要があります。
5.3. ジョブの実装 -アプリケーション・パッケージ・モデル
<?xml version="1.0" encoding="UTF-8"?>
<job id="JobA" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
・・・・
</job>
例:JobA.xmlのフォーマット
ジョブXMLのファイル名とジョブIdを一
致させます。
57
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
以下は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_a-
Maintenance_Release.pdf?AuthParam=1451183891_d8aab26344cecb4fff10993b245f74ab
5.3. ジョブの実装 -クラス一覧
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
まずは、以下の開発環境が準備されていることを確認してください。
前提
WebSphere Liberty ProfileWLP) が導入済みであること。
WLP のバージョンは8.5.5.6 以降であること。
フィーチャー:batchManagement-1.0 が導入済みであること。
接続するDB を準備してあること。
6.1. 開発環境について
60
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
ここからは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. ジョブの実行結果
6.2. 開発の流れ
61
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
以下のサイトの手順を参考にEclipseWDTを導入します。
http://www.ibm.com/developerworks/jp/websphere/library/was/liberty_intro/1.html
6.3. 手順解説 -1. Eclipse WDT の導入
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 は自動的に有効になります。
5. Server ビューから作成したWLP を右クリ
ックしてServer を開始します。
server.xml
65
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
WLP のバッチフィーチャーが適切に動作するためにはJob Repositoryとして永続ストアが必要です。バッチランタイムは必要な表
を自動作成するので、server.xml に使用するDB を指定する必要があります。DB はサポートされているDBベンダーの中から
選択することができます。(ここで指定したDBがバッチランタイムのJobRepository にあたります。)
1. 当資料では、Derby を使用し、createDatabase="create"に指定することで自動的にデータベースを作成します
2. 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(デフォルト)
6.3. 手順解説 -4. データベース接続の設定
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 Namesleepybatchlet
Target runtimeWLP
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
4. JSL Editor の「Reference」をクリックします。
5. New Batchlet Class に以下を入力して「Finish
をクリックします。
Java package
com.ibm.ws.jbatch.sample.sleepybatchlet
Class nameSleepyBatchlet
Batch artifact loading option:デフォル
6.3. 手順解説 -7. batchletステップの作成(3)
73
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
6. 作成したsleepybatchlet.class を開いて以下のソースコードに書き換えます。
6.3. 手順解説 -7. batchletステップの作成(4)-1
package com.ibm.ws.jbatch.sample.sleepybatchlet;
import java.util.logging.Logger;
import javax.batch.api.BatchProperty;
import javax.batch.api.Batchlet;
import 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.
*/
@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) {
・・・・・
batchletの処理を実装します。
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:", "");
stopRequested = true;
}
}
process() の実行中に、ジョブの中
が指示された場合に呼び出されます。
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
1. Server ビューWLP を右クリックして「Add and Remove」をクリックします。
2. SleepyBatchletSample」を選択して「Add」をクリックします。「Finish」をクリックします。
6.3. 手順解説 -8. デプロイ
79
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
1. server.xml に以下を追加します。server.xml ファイル内で SSL 証明書およびユーザー・レジストリーを作
成して、 batchManagement-1.0 が自動的に SSL フィーチャーを有効にするようにします。
(参考) http://www-
01.ibm.com/support/knowledgecenter/SSD28V_8.5.5/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/t
wlp_batch_configrest.html
6.3. 手順解説 -9. ジョブの実行(1)
server.xml
80
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
2. Workspace sleepy-batchlet.xml を右クリックして「Run As-> Java EE Batch Job」をクリックし
ます。
6.3. 手順解説 -9. ジョブの実行(2)
3. Run Configurations に以下を入
力して「Run」をクリックします。
User IDbob
Passwordbobpwd
Job Parameters
Namesleep.time.seconds
Value30
81
© 2016 IBM Corporation
JSR-352 Batch Applications for Java Platform
前頁の手順でバッチジョブを実行すると、以下のダイアログが出力されます。
ジョブが正常に登録されたことを確認します。ダイアログに"The job "sleepy-batchlet" with ID "1" was
submitted successfully." と表示されていればジョブは正常に登録されています。
当資料のjBatch アプリケーションの作成の手順は以下の資料を参考にしています。
(参考)WASdevCreating a simple Java batch application using WebSphere Developer Tools
https://developer.ibm.com/wasdev/docs/creating-simple-java-batch-application-using-websphere-developer-tools/
6.3. 手順解説 -10. ジョブの実行結果
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
wasdevbatch タグ アーカイブ
https://developer.ibm.com/wasdev/blog/tag/batch/
Knowledge CenterLiberty プロファイルの Java バッチ・アプリケーションのデプロイ
http://www-
01.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

Navigation menu