Upload
jun-inose
View
2.225
Download
22
Embed Size (px)
Citation preview
『Java EE 7 徹底入門』 バッチアプリケーションの開発 jBatch
2016/02/15 JJUG ナイトセミナー
#JJUG
猪瀬 淳 @inose660
Safe Harbor Statement • 本資料は私個人の見解であり所属会社の見解を反映したものではありません。
• 本資料の作成にあたっては正確な記述につとめましたが、内容に対してなんら保証をするものではなく、内容に基づくいかなる運用結果に関してもいっさいの責任を負いません。
2 2016/02/15 JJUG Night Seminar #JJUG
自己紹介
• 割愛
3 2016/02/15 JJUG Night Seminar #JJUG
本日話す内容
• What is “jBatch” / Why “jBatch”
• jBatch の構成要素と機能 • ジョブ
• ステップ
• 補助機能
• 本書に書いていない話
2016/02/15 JJUG Night Seminar #JJUG 4
What is “jBatch”
• Java EE におけるバッチ処理の標準
• Version 1.0 として Java EE 7 から登場
• JSR-352 (Batch Applications for Java Platform)で規定
• Spring Batch から多くを継承
2016/02/15 JJUG Night Seminar #JJUG 5
1. プロセスとして実行
4. jBatchを利用
2. 自作スレッドとして実行
JVM
Why “jBatch”?
6 2016/02/15 JJUG Night Seminar #JJUG
JVM バッチ 処理
JVM バッチ 処理
JVM バッチ 処理
main
バッチ処理
バッチ処理
バッチ処理
APサーバ (JVM)
jBatch のジョブ = バッチ処理
jBatch のジョブ = バッチ処理
jBatch のジョブ = バッチ処理
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド
プロセス
プロセス
プロセス
3. サーブレットとして実行
APサーバ (JVM)
servlet
バッチ処理
バッチ処理
バッチ処理
スレッド
スレッド
スレッド
Java でバッチを実行する4つの方法
1. プロセスとして実行 2. 自作スレッドとして実行
JVM
7 2016/02/15 JJUG Night Seminar #JJUG
JVM バッチ 処理
JVM バッチ 処理
JVM バッチ 処理
main
バッチ処理
バッチ処理
バッチ処理
スレッド
スレッド
スレッド
プロセス
プロセス
プロセス
シンプル 起動停止や実行状況の把握などが直感的
JVM 起動時間のオーバーヘッド
APサーバで動く他の部品との共有が難しい (CDI/EJB/JPAなど、Java EE の他の機能を使うにはライブラリの追加が必要)
スレッドはプロセスに比べて軽く起動できる
スレッドを管理する main プログラムを自作する必要がある
APサーバで動く他の部品との共有が難しい (CDI/EJB/JPAなど、Java EE の他の機能を使うにはライブラリの追加が必要)
○
△ △
△
△ ○
Why “jBatch”? Java でバッチを実行する4つの方法
3. サーブレットとして実行 4. jBatchを利用
8 2016/02/15 JJUG Night Seminar #JJUG
APサーバ (JVM)
jBatch のジョブ = バッチ処理
jBatch のジョブ = バッチ処理
jBatch のジョブ = バッチ処理
スレッド
スレッド
スレッド
APサーバ (JVM)
servlet
バッチ処理
バッチ処理
バッチ処理
スレッド
スレッド
スレッド
スレッドはプロセスに比べて軽く起動できる
スレッド管理プログラムを自作する必要がない
APサーバで動く他の部品との共有が容易 (CDI/EJB/JPAなど Java EEの機能が利用可能)
実行状況の把握, スレッドの停止が難しい HTTP リクエストタイムアウトの問題
スレッドはプロセスに比べて軽く起動できる
スレッド管理プログラムを自作する必要がない
APサーバで動く他の部品との共有が容易 (CDI/EJB/JPAなど Java EEの機能が利用可能)
実行状況の確認方法、ジョブの起動停止などの方法が用意されている
△
○ ○
○ ○ ○
○
○ △
Why “jBatch”? Java でバッチを実行する4つの方法
ジョブ
<job><step> </step><step> </step><step> </step>
</job>
public class Step1Impl (…)...{}
public class Step2Impl (…)...{}
public class Step3Impl (…)...{}
ステップ ステップ ステップ
jBatch の構成要素 : “ジョブ” と “ステップ”
9 2016/02/15 JJUG Night Seminar #JJUG
“ジョブ” は “ステップ” の入れ物
ステップに、 具体的な 処理を Java で 記述
各ステップの名前や実行順序、設定等を XMLで記述 (Job XML)
ステップに、 具体的な 処理を Java で 記述
ステップに 具体的な 処理を Java で 記述
Job XML
もう少し拡大すると
10 2016/02/15 JJUG Night Seminar #JJUG
<job id="SampleJob" xmlns="...." version="1.0">
SampleJob.xml
public class MyProg implements Batchlet { public String process()
<property name="InputFile" value="C://myfile1" /> <step id="STEP1"> <batchlet ref="com.example.MyProg" /> </step>
</job>
:
:
:
:
ジョブ名
各種設定
(property)
<job>要素
<step>要素
ステップは、用意された インターフェースを実装
ステップ
ジョブ:
ステップの クラス名
ジョブとステップとの分離
11 2016/02/15 JJUG Night Seminar #JJUG
// SAMPLEJOB JOB 1234, JINOSE // STEP1 EXEC PGM=MYPROG // INFILED DD DSN=USER1.MYFILE1, DISP=OLD // OUTFILED DD SYSOUT=* :
JCL MYPROG
COBOL や PL/I などで 書かれたプログラム
• ジョブとステップの分離は、古くはホスト時代にさかのぼる
• jBatch は、時代や言語を問わずに共通する バッチ処理の「ひな型」を提供
ステップ
jBatch の構成要素と機能
12 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• チャンク
• バッチレット
• ステップ・パーティショニング
• フロー
• スプリット
• デシジョン
• 遷移要素
• ジョブオペレータ
• リトライ
• スキップ
• ジョブリポジトリ
• リスナ
• コンテキスト
• メトリック
処理の順序制御
実装の
テンプレート提供
実行順序を表現する XML タグ群
• フロー <flow>
• スプリット <split>
• デシジョン <decision>
13 2016/02/15 JJUG Night Seminar #JJUG
• 遷移要素
<next>
<stop>
<end>
<fail>
ジョブ
ステップ
補助機能
例 Job
step
flow
step step step
step
flow
step step
flow
step step step
flow
step step stepend
stop
fail
split
dec
isio
n
flow
step step
end
failstep
[Tips] Job XML の root 要素
14 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• Java EE 7 で利用できる XSD の一覧はコチラhttp://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html#7
XSDを指定することにより、 エディタがアシストしてくれるよ
うになる
XSD を指定することにより、 エディタが補完してくれるようになる
ジョブ全体の開始/中断/再開
15 2016/02/15 JJUG Night Seminar #JJUG
ステップ
補助機能
ジョブ
Properties p = new Properties(); : JobOperator jo = BatchRuntime.getJobOperator(); long jobExecId = jo.start("SimpleBatch", p);
jo.stop(jobExecId, p);
long jobExecId = jo.restart(jobExecId, p);
開始
中断
再開
• ジョブオペレータ (javax.batch.operations.JobOperator)
ジョブオペレータの呼び出し方法
16 2016/02/15 JJUG Night Seminar #JJUG
ステップ
ジョブ
Shell script.batファイル アプリケーションサーバ
(Java EE コンテナ)
JAX-RS
EJB
ジョブスケジューラ
ブラウザ
スマートデバイス
オペレータ
アドホックな実行
定刻起動
オペレータ
POJO(CDI)
jBatchコンテナ
jobOperator.start().stop()
.restart()
JSF
マネージドビーン
JAX-RSclient
EJBclient
外部システム
補助機能
ジョブオペレータの
呼び出し方法は、jBatch 仕様では 規定されていない
本書では、JAX-RSを
用いた起動方法と、JSF を用いた管理 画面の作成を紹介
エラーハンドリング
17 2016/02/15 JJUG Night Seminar #JJUG
ステップ
補助機能
ジョブ
リトライ 再度そのデータの処理を試みる
スキップ 該当データの処理を飛ばして、
次のデータへ処理を進める
• データ処理中に例外が発生したらどうするか?
• チャンク型ステップ (後述) の処理が対象
• 上記対処の対象とする例外クラスの名前を Job XML に記述しておく
ステップ
• 『チャンク型』 と 『バッチレット型』 の2種類
• チャンク型は “複数データの一括処理” を担う
18 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
Batchlet データに依存しない処理やコマンド実行など
ItemReader : データの読み込みに対応
バッチレット型
チャンク型
ItemProcessor : データの加工などの処理に対応
ItemWriter : データの書き込みに対応
複数データの一括処理
単発の処理
協調
動作
書込みをまとめることにより、物理的な I/O の回数を削減
性能上の効率と 障害発生時の
やり直しのリスクとの兼ね合いを図って いる
チャンク型のステップ
19 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
読み込み処理
ItemReader ItemProcessor
加工等の処理
読み込み処理 加工等の処理
ItemWriter
複数件のデータをまとめて書き込み
デフォルトでは10回に1度の呼び出し
APサーバ
読込と加工等の処理を繰り返し
checkpoint::
ステップ = 実装のテンプレート
• 実体は Interface 開発者は用意されたメソッドを Override
20 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
public class SimpleBatchlet implements Batchlet {
public class SimpleReader implements ItemReader {
バッチレット型
チャンク型
public class SimpleProcessor implements ItemProcessor {
public class SimpleWriter implements ItemWriter {
複数データの一括処理
単発の処理
open() writeItems() close() checkpointInfo()
open() readItems() close() checkpointInfo()
processItem()
process() stop()
補助機能
21 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• ジョブリポジトリ
• リスナ
• コンテキスト
• メトリック
補助機能
• ジョブリポジトリ
– ジョブやステップの情報を格納
– 通常はAPサーバ配下にある 内部DBが実体
– APサーバの 管理画面でも 確認できる
22 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
補助機能
• リスナ
aft
erJ
ob
()
aft
erS
tep
()
bat
chle
t
aft
erS
tep
()
be
fore
Ste
p()
ジョブ
onError()
aft
erC
hu
nk()
be
fore
Jo
b()
be
fore
Ste
p()
be
fore
Ch
un
k()
be
fore
Wri
te()
aft
erW
rite
()
be
fore
Re
ad
()
aft
erR
ea
d()
be
fore
Pro
ce
ss()
aft
erP
roce
ss()
retry / skip
onWriteError()
retry / skip
onReadError()
retry / skip
onProcessError()
ステップ ステップ
チャンク
JobListener
StepListener
ChunkListener
ItemReadListener
ItemProcessListener
ItemWriteListener
StepListener
RetryReadListener.onRetryReadException() SkipReadListener.onSkipReadItem()
RetryProcessListener.onRetryProcessException() SkipProcessListener.onSkipProcessItem() RetryWriteListener.onRetryWriteException()
SkipWriteListener.onSkipWriteItem()
Ite
mW
rite
r
Ite
mR
ead
er
Ite
mP
roce
sso
r処理の前後で
イベントが発生
→ リスナを付与し、
任意の処理を
差し込み
23 2016/02/15 JJUG Night Seminar #JJUG
補助機能
24 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• コンテキスト
– JobContext と StepContext の2種類
– プロパティやステータスなど、実行中のジョブ/ステップに関する情報を API 経由で提供
– UserData として、ジョブ/ステップに横断的な 任意の値をセットすることもできる
– Step の UserData は永続化可能
補助機能
25 2016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• メトリック
– ステップに関する統計情報
– StepContext#getMetrics() より取得可能
– APサーバの管理画面でも 確認できる
10章の構成
• 10.1 jBatch の基本
• 10.2 jBatch の利用 – 基本編
• 10.3 jBatch の利用 – 応用編
• 10.4 ジョブの作成
• 10.5 ジョブのフロー制御
26 2016/02/15 JJUG Night Seminar #JJUG
jBatch の構成要素の紹介
ログ出力のみのジョブを用いて, XMLの書法と各メソッドの説明
Property, コンテキスト, メトリック, Checkpoint, リスナの活用例と バッチ/終了ステータスの説明
split, flow, decision, 遷移要素の活用例の紹介
本書に書いていない話
2016/02/15 JJUG Night Seminar #JJUG 27
ステップ・パーティショニング
28 2016/02/15 JJUG Night Seminar #JJUG
Interface 概要
PartitionPlan / PartitionMapper
パーティション数, スレッド数, パーティションごとのプロパティなどを動的に提供する (これを使わない場合は、上記のような設定を Job XML に静的に定義する)
PartitionReducer パーティション分散の前処理、および直後での待ち合わせ処理を実装する
PartitionCollector 各パーティション内のステップの処理結果を遂次 PartitionAnalyzer に送信する
PartitionAnalyzer PartitionCollectorから受信したデータをステップのメインスレッドで処理する
<step id="Step1"> <chunk ...> or <batchlet ...> : </chunk> or </batchlet> <partition> <plan partitions="3" threads="3" /> <reducer ref="...." /> : </partition> </step>
• ステップを任意のスレッド数で 並行して処理する機能
• 本書では紙幅と時間が尽きたため割愛
なぜ入出力ファイルを CSV 形式にしたのか?
• 当初は入出力ファイルを JSON 形式として、ついでに Java EE 7 で 追加された JSON-P の API の紹介もしようかと考えていた
• jBatchでは、チャンクの処理途中で失敗した場合に備えて再実行 (restart) が出来るように配慮されている → これも当然紹介したい
• JSONやXML形式のファイルには、終端に閉じカッコや終了タグなどが必要 – 例えばファイルの書き込み途中で失敗したあとに再開した場合、 終端がないことにより文書の操作に失敗する
• 結局1行で完結するCSVファイルのほうが jBatch との親和性が高い – ただしCSVはデータ中にカンマが混入する可能性を考慮する必要あり
29 2016/02/15 JJUG Night Seminar #JJUG
ここがヘンだよ jBatch
• チャンクの ItemReader / Processor / Writer 間で ジェネリクスが使えない!(Spring Batchなら…)
• 終了ステータス/バッチステータスが、ジョブとステップで 共用なのが直感的ではない
• flow / split 単位での property が指定できない
• GF の参照実装 (TCK) だと動かない機能がいくつか…
30 2016/02/15 JJUG Night Seminar #JJUG
バージョンアップ / jBatch 1.1 に期待しましょう
Thank you!
ご清聴ありがとうございました