20160215 04 java ee7徹底入門 jbatch

31
Java EE 7 徹底入門』 バッチアプリケーションの開発 jBatch 2016/02/15 JJUG ナイトセミナー #JJUG 猪瀬 @inose660

Upload: jun-inose

Post on 09-Jan-2017

2.225 views

Category:

Software


22 download

TRANSCRIPT

Page 1: 20160215 04 java ee7徹底入門 jbatch

『Java EE 7 徹底入門』 バッチアプリケーションの開発 jBatch

2016/02/15 JJUG ナイトセミナー

#JJUG

猪瀬 淳 @inose660

Page 2: 20160215 04 java ee7徹底入門 jbatch

Safe Harbor Statement • 本資料は私個人の見解であり所属会社の見解を反映したものではありません。

• 本資料の作成にあたっては正確な記述につとめましたが、内容に対してなんら保証をするものではなく、内容に基づくいかなる運用結果に関してもいっさいの責任を負いません。

2 2016/02/15 JJUG Night Seminar #JJUG

Page 3: 20160215 04 java ee7徹底入門 jbatch

自己紹介

• 割愛

3 2016/02/15 JJUG Night Seminar #JJUG

Page 4: 20160215 04 java ee7徹底入門 jbatch

本日話す内容

• What is “jBatch” / Why “jBatch”

• jBatch の構成要素と機能 • ジョブ

• ステップ

• 補助機能

• 本書に書いていない話

2016/02/15 JJUG Night Seminar #JJUG 4

Page 5: 20160215 04 java ee7徹底入門 jbatch

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

Page 6: 20160215 04 java ee7徹底入門 jbatch

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つの方法

Page 7: 20160215 04 java ee7徹底入門 jbatch

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つの方法

Page 8: 20160215 04 java ee7徹底入門 jbatch

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つの方法

Page 9: 20160215 04 java ee7徹底入門 jbatch

ジョブ

<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

Page 10: 20160215 04 java ee7徹底入門 jbatch

もう少し拡大すると

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>要素

ステップは、用意された インターフェースを実装

ステップ

ジョブ:

ステップの クラス名

Page 11: 20160215 04 java ee7徹底入門 jbatch

ジョブとステップとの分離

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 は、時代や言語を問わずに共通する バッチ処理の「ひな型」を提供

ステップ

Page 12: 20160215 04 java ee7徹底入門 jbatch

jBatch の構成要素と機能

12 2016/02/15 JJUG Night Seminar #JJUG

ジョブ

ステップ

補助機能

• チャンク

• バッチレット

• ステップ・パーティショニング

• フロー

• スプリット

• デシジョン

• 遷移要素

• ジョブオペレータ

• リトライ

• スキップ

• ジョブリポジトリ

• リスナ

• コンテキスト

• メトリック

処理の順序制御

実装の

テンプレート提供

Page 13: 20160215 04 java ee7徹底入門 jbatch

実行順序を表現する 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

Page 14: 20160215 04 java ee7徹底入門 jbatch

[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 を指定することにより、 エディタが補完してくれるようになる

Page 15: 20160215 04 java ee7徹底入門 jbatch

ジョブ全体の開始/中断/再開

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)

Page 16: 20160215 04 java ee7徹底入門 jbatch

ジョブオペレータの呼び出し方法

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 を用いた管理 画面の作成を紹介

Page 17: 20160215 04 java ee7徹底入門 jbatch

エラーハンドリング

17 2016/02/15 JJUG Night Seminar #JJUG

ステップ

補助機能

ジョブ

リトライ 再度そのデータの処理を試みる

スキップ 該当データの処理を飛ばして、

次のデータへ処理を進める

• データ処理中に例外が発生したらどうするか?

• チャンク型ステップ (後述) の処理が対象

• 上記対処の対象とする例外クラスの名前を Job XML に記述しておく

Page 18: 20160215 04 java ee7徹底入門 jbatch

ステップ

• 『チャンク型』 と 『バッチレット型』 の2種類

• チャンク型は “複数データの一括処理” を担う

18 2016/02/15 JJUG Night Seminar #JJUG

ジョブ

ステップ

補助機能

Batchlet データに依存しない処理やコマンド実行など

ItemReader : データの読み込みに対応

バッチレット型

チャンク型

ItemProcessor : データの加工などの処理に対応

ItemWriter : データの書き込みに対応

複数データの一括処理

単発の処理

協調

動作

Page 19: 20160215 04 java ee7徹底入門 jbatch

書込みをまとめることにより、物理的な I/O の回数を削減

性能上の効率と 障害発生時の

やり直しのリスクとの兼ね合いを図って いる

チャンク型のステップ

19 2016/02/15 JJUG Night Seminar #JJUG

ジョブ

ステップ

補助機能

読み込み処理

ItemReader ItemProcessor

加工等の処理

読み込み処理 加工等の処理

ItemWriter

複数件のデータをまとめて書き込み

デフォルトでは10回に1度の呼び出し

APサーバ

読込と加工等の処理を繰り返し

checkpoint::

Page 20: 20160215 04 java ee7徹底入門 jbatch

ステップ = 実装のテンプレート

• 実体は 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()

Page 21: 20160215 04 java ee7徹底入門 jbatch

補助機能

21 2016/02/15 JJUG Night Seminar #JJUG

ジョブ

ステップ

補助機能

• ジョブリポジトリ

• リスナ

• コンテキスト

• メトリック

Page 22: 20160215 04 java ee7徹底入門 jbatch

補助機能

• ジョブリポジトリ

– ジョブやステップの情報を格納

– 通常はAPサーバ配下にある 内部DBが実体

– APサーバの 管理画面でも 確認できる

22 2016/02/15 JJUG Night Seminar #JJUG

ジョブ

ステップ

補助機能

Page 23: 20160215 04 java ee7徹底入門 jbatch

補助機能

• リスナ

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

Page 24: 20160215 04 java ee7徹底入門 jbatch

補助機能

24 2016/02/15 JJUG Night Seminar #JJUG

ジョブ

ステップ

補助機能

• コンテキスト

– JobContext と StepContext の2種類

– プロパティやステータスなど、実行中のジョブ/ステップに関する情報を API 経由で提供

– UserData として、ジョブ/ステップに横断的な 任意の値をセットすることもできる

– Step の UserData は永続化可能

Page 25: 20160215 04 java ee7徹底入門 jbatch

補助機能

25 2016/02/15 JJUG Night Seminar #JJUG

ジョブ

ステップ

補助機能

• メトリック

– ステップに関する統計情報

– StepContext#getMetrics() より取得可能

– APサーバの管理画面でも 確認できる

Page 26: 20160215 04 java ee7徹底入門 jbatch

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, 遷移要素の活用例の紹介

Page 27: 20160215 04 java ee7徹底入門 jbatch

本書に書いていない話

2016/02/15 JJUG Night Seminar #JJUG 27

Page 28: 20160215 04 java ee7徹底入門 jbatch

ステップ・パーティショニング

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>

• ステップを任意のスレッド数で 並行して処理する機能

• 本書では紙幅と時間が尽きたため割愛

Page 29: 20160215 04 java ee7徹底入門 jbatch

なぜ入出力ファイルを CSV 形式にしたのか?

• 当初は入出力ファイルを JSON 形式として、ついでに Java EE 7 で 追加された JSON-P の API の紹介もしようかと考えていた

• jBatchでは、チャンクの処理途中で失敗した場合に備えて再実行 (restart) が出来るように配慮されている → これも当然紹介したい

• JSONやXML形式のファイルには、終端に閉じカッコや終了タグなどが必要 – 例えばファイルの書き込み途中で失敗したあとに再開した場合、 終端がないことにより文書の操作に失敗する

• 結局1行で完結するCSVファイルのほうが jBatch との親和性が高い – ただしCSVはデータ中にカンマが混入する可能性を考慮する必要あり

29 2016/02/15 JJUG Night Seminar #JJUG

Page 30: 20160215 04 java ee7徹底入門 jbatch

ここがヘンだよ jBatch

• チャンクの ItemReader / Processor / Writer 間で ジェネリクスが使えない!(Spring Batchなら…)

• 終了ステータス/バッチステータスが、ジョブとステップで 共用なのが直感的ではない

• flow / split 単位での property が指定できない

• GF の参照実装 (TCK) だと動かない機能がいくつか…

30 2016/02/15 JJUG Night Seminar #JJUG

バージョンアップ / jBatch 1.1 に期待しましょう

Page 31: 20160215 04 java ee7徹底入門 jbatch

Thank you!

ご清聴ありがとうございました