『Java EE 7 徹底入門』
バッチアプリケーションの開発 jBatch
2016/02/15 JJUG ナイトセミナー
#JJUG
猪瀬 淳
@inose660
Safe Harbor Statement
• 本資料は私個人の見解であり所属会社の見解を反映したものではありません。
• 本資料の作成にあたっては正確な記述につとめましたが、内容に対してなんら
保証をするものではなく、内容に基づくいかなる運用結果に関してもいっさいの
責任を負いません。
22016/02/15 JJUG Night Seminar #JJUG
自己紹介
• 割愛
32016/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”?
62016/02/15 JJUG Night Seminar #JJUG
JVM
バッチ
処理
JVM
バッチ
処理
JVM
バッチ
処理
main
バッチ処理
バッチ処理
バッチ処理
APサーバ
(JVM)
jBatch のジョブ = バッチ処理
jBatch のジョブ = バッチ処理
jBatch のジョブ = バッチ処理
スレッド
スレッド
スレッド
スレッド
スレッド
スレッド
プロセス
プロセス
プロセス
3. サーブレットとして実行
APサーバ (JVM)
servlet
バッチ処理
バッチ処理
バッチ処理
スレッド
スレッド
スレッド
Java でバッチを実行する4つの方法
1. プロセスとして実行 2. 自作スレッドとして実行
JVM
72016/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を利用
82016/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 の構成要素 : “ジョブ” と “ステップ”
92016/02/15 JJUG Night Seminar #JJUG
“ジョブ” は
“ステップ”
の入れ物
ステップ
に、
具体的な
処理を
Java で
記述
各ステップの名
前や実行順序、
設定等を XMLで
記述 (Job XML)
ステップ
に、
具体的な
処理を
Java で
記述
ステップに
具体的な
処理を
Java で
記述
Job XML
もう少し拡大すると
102016/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>要素
ステップは、用意された
インターフェースを実装
ステップ
ジョブ:
ステップの
クラス名
ジョブとステップとの分離
112016/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 の構成要素と機能
122016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• チャンク
• バッチレット
• ステップ・パーティショニング
• フロー
• スプリット
• デシジョン
• 遷移要素
• ジョブオペレータ
• リトライ
• スキップ
• ジョブリポジトリ
• リスナ
• コンテキスト
• メトリック
処理の順序制御
実装の
テンプレート提供
実行順序を表現する XML タグ群
• フロー <flow>
• スプリット <split>
• デシジョン <decision>
132016/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 step
end
stop
fail
split
decision
flow
step step
end
fail
step
[Tips] Job XML の root 要素
142016/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 を指定することにより、
エディタが補完してくれるようになる
ジョブ全体の開始/中断/再開
152016/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)
ジョブオペレータの呼び出し方法
162016/02/15 JJUG Night Seminar #JJUG
ステップ
ジョブ
Shell script
.batファイル アプリケーション サーバ
(Java EE コンテナ)
JAX-RS
EJB
ジョブ
スケジューラ
ブラウザ
スマートデバイス
オペレータ
アドホックな実行
定刻起動
オペレータ
POJO
(CDI)
jBatch コンテナ
jobOperator
.start()
.stop()
.restart()
JSF
マネージド
ビーン
JAX-RS
client
EJB
client
外部
システム
補助機能
ジョブオペレータの
呼び出し方法は、
jBatch 仕様では
規定されていない
本書では、JAX-RSを
用いた起動方法と、
JSF を用いた管理
画面の作成を紹介
エラーハンドリング
172016/02/15 JJUG Night Seminar #JJUG
ステップ
補助機能
ジョブ
リトライ
再度そのデータの処理を試みる
スキップ
該当データの処理を飛ばして、
次のデータへ処理を進める
• データ処理中に例外が発生したらどうするか?
• チャンク型ステップ (後述) の処理が対象
• 上記対処の対象とする例外クラスの名前を
Job XML に記述しておく
ステップ
• 『チャンク型』 と 『バッチレット型』 の2種類
• チャンク型は “複数データの一括処理” を担う
182016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
Batchlet
データに依存しない処理やコマンド実行など
ItemReader : データの読み込みに対応
バッチレット型
チャンク型
ItemProcessor : データの加工などの処理に対応
ItemWriter : データの書き込みに対応
複数データの
一括処理
単発の処理
協調
動作
書込みをまとめるこ
とにより、物理的な
I/O の回数を削減
性能上の効率と
障害発生時の
やり直しのリスクとの
兼ね合いを図って
いる
チャンク型のステップ
192016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
読み込み処理
ItemReader ItemProcessor
加工等の
処理
読み込み処理 加工等の
処理
ItemWriter
複数件のデータを
まとめて書き込み
デフォルトでは10回に
1度の呼び出し
APサーバ
読込と加工等の
処理を繰り返し
checkpoint
:
:
ステップ = 実装のテンプレート
• 実体は Interface
 開発者は用意されたメソッドを Override
202016/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()
補助機能
212016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• ジョブリポジトリ
• リスナ
• コンテキスト
• メトリック
補助機能
• ジョブリポジトリ
– ジョブやステップ
の情報を格納
– 通常はAPサー
バ配下にある
内部DBが実体
– APサーバの
管理画面でも
確認できる
222016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
補助機能
• リスナ
afterJob()
afterStep()
batchlet
afterStep()
beforeStep()
ジョブ
onError()
afterChunk()
beforeJob()
beforeStep()
beforeChunk()
beforeWrite()
afterWrite()
beforeRead()
afterRead()
beforeProcess()
afterProcess()
retry / skip
onWriteError()
retry / skip
onReadError()
retry / skip
onProcessError()
ステップ ステップ
チャンク
JobListener
StepListener
ChunkListener
ItemRead
Listener
ItemProcess
Listener
ItemWrite
Listener
StepListener
RetryReadListener.onRetryReadException()
SkipReadListener.onSkipReadItem()
RetryProcessListener.onRetryProcessException()
SkipProcessListener.onSkipProcessItem() RetryWriteListener.onRetryWriteException()
SkipWriteListener.onSkipWriteItem()
ItemWriter
ItemReader
ItemProcessor
処理の前後で
イベントが発生
→ リスナを付与し、
任意の処理を
差し込み
232016/02/15 JJUG Night Seminar #JJUG
補助機能
242016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• コンテキスト
– JobContext と StepContext の2種類
– プロパティやステータスなど、実行中のジョブ/ステップに
関する情報を API 経由で提供
– UserData として、ジョブ/ステップに横断的な
任意の値をセットすることもできる
– Step の UserData は永続化可能
補助機能
252016/02/15 JJUG Night Seminar #JJUG
ジョブ
ステップ
補助機能
• メトリック
– ステップに関する統計情報
– StepContext#getMetrics()
より取得可能
– APサーバの管理画面でも
確認できる
10章の構成
• 10.1 jBatch の基本
• 10.2 jBatch の利用 – 基本編
• 10.3 jBatch の利用 – 応用編
• 10.4 ジョブの作成
• 10.5 ジョブのフロー制御
262016/02/15 JJUG Night Seminar #JJUG
jBatch の構成要素の紹介
ログ出力のみのジョブを用いて,
XMLの書法と各メソッドの説明
Property, コンテキスト, メトリック,
Checkpoint, リスナの活用例と
バッチ/終了ステータスの説明
split, flow, decision, 遷移要素の
活用例の紹介
本書に書いていない話
2016/02/15 JJUG Night Seminar #JJUG 27
ステップ・パーティショニング
282016/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はデータ中にカンマが混入する可能性を考慮する必要あり
292016/02/15 JJUG Night Seminar #JJUG
ここがヘンだよ jBatch
• チャンクの ItemReader / Processor / Writer 間で
ジェネリクスが使えない!(Spring Batchなら…)
• 終了ステータス/バッチステータスが、ジョブとステップで
共用なのが直感的ではない
• flow / split 単位での property が指定できない
• GF の参照実装 (TCK) だと動かない機能がいくつか…
302016/02/15 JJUG Night Seminar #JJUG
バージョンアップ / jBatch 1.1 に期待しましょう
Thank you!
ご清聴ありがとうございました

20160215 04 java ee7徹底入門 jbatch

  • 1.
    『Java EE 7徹底入門』 バッチアプリケーションの開発 jBatch 2016/02/15 JJUG ナイトセミナー #JJUG 猪瀬 淳 @inose660
  • 2.
    Safe Harbor Statement •本資料は私個人の見解であり所属会社の見解を反映したものではありません。 • 本資料の作成にあたっては正確な記述につとめましたが、内容に対してなんら 保証をするものではなく、内容に基づくいかなる運用結果に関してもいっさいの 責任を負いません。 22016/02/15 JJUG Night Seminar #JJUG
  • 3.
  • 4.
    本日話す内容 • What is“jBatch” / Why “jBatch” • jBatch の構成要素と機能 • ジョブ • ステップ • 補助機能 • 本書に書いていない話 2016/02/15 JJUG Night Seminar #JJUG 4
  • 5.
    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
  • 6.
    1. プロセスとして実行 4. jBatchを利用 2.自作スレッドとして実行 JVM Why “jBatch”? 62016/02/15 JJUG Night Seminar #JJUG JVM バッチ 処理 JVM バッチ 処理 JVM バッチ 処理 main バッチ処理 バッチ処理 バッチ処理 APサーバ (JVM) jBatch のジョブ = バッチ処理 jBatch のジョブ = バッチ処理 jBatch のジョブ = バッチ処理 スレッド スレッド スレッド スレッド スレッド スレッド プロセス プロセス プロセス 3. サーブレットとして実行 APサーバ (JVM) servlet バッチ処理 バッチ処理 バッチ処理 スレッド スレッド スレッド Java でバッチを実行する4つの方法
  • 7.
    1. プロセスとして実行 2.自作スレッドとして実行 JVM 72016/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つの方法
  • 8.
    3. サーブレットとして実行 4.jBatchを利用 82016/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つの方法
  • 9.
    ジョブ <job> <step> </step> <step> </step> <step></step> </job> public class Step1Impl (…)...{ } public class Step2Impl (…)...{ } public class Step3Impl (…)...{ } ステップ ステップ ステップ jBatch の構成要素 : “ジョブ” と “ステップ” 92016/02/15 JJUG Night Seminar #JJUG “ジョブ” は “ステップ” の入れ物 ステップ に、 具体的な 処理を Java で 記述 各ステップの名 前や実行順序、 設定等を XMLで 記述 (Job XML) ステップ に、 具体的な 処理を Java で 記述 ステップに 具体的な 処理を Java で 記述 Job XML
  • 10.
    もう少し拡大すると 102016/02/15 JJUG NightSeminar #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.
    ジョブとステップとの分離 112016/02/15 JJUG NightSeminar #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 は、時代や言語を問わずに共通する バッチ処理の「ひな型」を提供 ステップ
  • 12.
    jBatch の構成要素と機能 122016/02/15 JJUGNight Seminar #JJUG ジョブ ステップ 補助機能 • チャンク • バッチレット • ステップ・パーティショニング • フロー • スプリット • デシジョン • 遷移要素 • ジョブオペレータ • リトライ • スキップ • ジョブリポジトリ • リスナ • コンテキスト • メトリック 処理の順序制御 実装の テンプレート提供
  • 13.
    実行順序を表現する XML タグ群 •フロー <flow> • スプリット <split> • デシジョン <decision> 132016/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 step end stop fail split decision flow step step end fail step
  • 14.
    [Tips] Job XMLの root 要素 142016/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.
    ジョブ全体の開始/中断/再開 152016/02/15 JJUG NightSeminar #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.
    ジョブオペレータの呼び出し方法 162016/02/15 JJUG NightSeminar #JJUG ステップ ジョブ Shell script .batファイル アプリケーション サーバ (Java EE コンテナ) JAX-RS EJB ジョブ スケジューラ ブラウザ スマートデバイス オペレータ アドホックな実行 定刻起動 オペレータ POJO (CDI) jBatch コンテナ jobOperator .start() .stop() .restart() JSF マネージド ビーン JAX-RS client EJB client 外部 システム 補助機能 ジョブオペレータの 呼び出し方法は、 jBatch 仕様では 規定されていない 本書では、JAX-RSを 用いた起動方法と、 JSF を用いた管理 画面の作成を紹介
  • 17.
    エラーハンドリング 172016/02/15 JJUG NightSeminar #JJUG ステップ 補助機能 ジョブ リトライ 再度そのデータの処理を試みる スキップ 該当データの処理を飛ばして、 次のデータへ処理を進める • データ処理中に例外が発生したらどうするか? • チャンク型ステップ (後述) の処理が対象 • 上記対処の対象とする例外クラスの名前を Job XML に記述しておく
  • 18.
    ステップ • 『チャンク型』 と『バッチレット型』 の2種類 • チャンク型は “複数データの一括処理” を担う 182016/02/15 JJUG Night Seminar #JJUG ジョブ ステップ 補助機能 Batchlet データに依存しない処理やコマンド実行など ItemReader : データの読み込みに対応 バッチレット型 チャンク型 ItemProcessor : データの加工などの処理に対応 ItemWriter : データの書き込みに対応 複数データの 一括処理 単発の処理 協調 動作
  • 19.
    書込みをまとめるこ とにより、物理的な I/O の回数を削減 性能上の効率と 障害発生時の やり直しのリスクとの 兼ね合いを図って いる チャンク型のステップ 192016/02/15 JJUGNight Seminar #JJUG ジョブ ステップ 補助機能 読み込み処理 ItemReader ItemProcessor 加工等の 処理 読み込み処理 加工等の 処理 ItemWriter 複数件のデータを まとめて書き込み デフォルトでは10回に 1度の呼び出し APサーバ 読込と加工等の 処理を繰り返し checkpoint : :
  • 20.
    ステップ = 実装のテンプレート •実体は Interface  開発者は用意されたメソッドを Override 202016/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.
    補助機能 212016/02/15 JJUG NightSeminar #JJUG ジョブ ステップ 補助機能 • ジョブリポジトリ • リスナ • コンテキスト • メトリック
  • 22.
    補助機能 • ジョブリポジトリ – ジョブやステップ の情報を格納 –通常はAPサー バ配下にある 内部DBが実体 – APサーバの 管理画面でも 確認できる 222016/02/15 JJUG Night Seminar #JJUG ジョブ ステップ 補助機能
  • 23.
    補助機能 • リスナ afterJob() afterStep() batchlet afterStep() beforeStep() ジョブ onError() afterChunk() beforeJob() beforeStep() beforeChunk() beforeWrite() afterWrite() beforeRead() afterRead() beforeProcess() afterProcess() retry /skip onWriteError() retry / skip onReadError() retry / skip onProcessError() ステップ ステップ チャンク JobListener StepListener ChunkListener ItemRead Listener ItemProcess Listener ItemWrite Listener StepListener RetryReadListener.onRetryReadException() SkipReadListener.onSkipReadItem() RetryProcessListener.onRetryProcessException() SkipProcessListener.onSkipProcessItem() RetryWriteListener.onRetryWriteException() SkipWriteListener.onSkipWriteItem() ItemWriter ItemReader ItemProcessor 処理の前後で イベントが発生 → リスナを付与し、 任意の処理を 差し込み 232016/02/15 JJUG Night Seminar #JJUG
  • 24.
    補助機能 242016/02/15 JJUG NightSeminar #JJUG ジョブ ステップ 補助機能 • コンテキスト – JobContext と StepContext の2種類 – プロパティやステータスなど、実行中のジョブ/ステップに 関する情報を API 経由で提供 – UserData として、ジョブ/ステップに横断的な 任意の値をセットすることもできる – Step の UserData は永続化可能
  • 25.
    補助機能 252016/02/15 JJUG NightSeminar #JJUG ジョブ ステップ 補助機能 • メトリック – ステップに関する統計情報 – StepContext#getMetrics() より取得可能 – APサーバの管理画面でも 確認できる
  • 26.
    10章の構成 • 10.1 jBatchの基本 • 10.2 jBatch の利用 – 基本編 • 10.3 jBatch の利用 – 応用編 • 10.4 ジョブの作成 • 10.5 ジョブのフロー制御 262016/02/15 JJUG Night Seminar #JJUG jBatch の構成要素の紹介 ログ出力のみのジョブを用いて, XMLの書法と各メソッドの説明 Property, コンテキスト, メトリック, Checkpoint, リスナの活用例と バッチ/終了ステータスの説明 split, flow, decision, 遷移要素の 活用例の紹介
  • 27.
  • 28.
    ステップ・パーティショニング 282016/02/15 JJUG NightSeminar #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> • ステップを任意のスレッド数で 並行して処理する機能 • 本書では紙幅と時間が尽きた ため割愛
  • 29.
    なぜ入出力ファイルを CSV 形式にしたのか? •当初は入出力ファイルを JSON 形式として、ついでに Java EE 7 で 追加された JSON-P の API の紹介もしようかと考えていた • jBatchでは、チャンクの処理途中で失敗した場合に備えて再実行 (restart) が出来るように配慮されている → これも当然紹介したい • JSONやXML形式のファイルには、終端に閉じカッコや終了タグなどが必要 – 例えばファイルの書き込み途中で失敗したあとに再開した場合、 終端がないことにより文書の操作に失敗する • 結局1行で完結するCSVファイルのほうが jBatch との親和性が高い – ただしCSVはデータ中にカンマが混入する可能性を考慮する必要あり 292016/02/15 JJUG Night Seminar #JJUG
  • 30.
    ここがヘンだよ jBatch • チャンクのItemReader / Processor / Writer 間で ジェネリクスが使えない!(Spring Batchなら…) • 終了ステータス/バッチステータスが、ジョブとステップで 共用なのが直感的ではない • flow / split 単位での property が指定できない • GF の参照実装 (TCK) だと動かない機能がいくつか… 302016/02/15 JJUG Night Seminar #JJUG バージョンアップ / jBatch 1.1 に期待しましょう
  • 31.