SlideShare a Scribd company logo
『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!
ご清聴ありがとうございました

More Related Content

PDF
Jbatch実践入門 #jdt2015
PDF
Webアプリを並行開発する際のマイグレーション戦略
PDF
30分でわかるマイクロサービスアーキテクチャ 第2版
PDF
What's new in Spring Boot 2.6 ?
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
Javaのログ出力: 道具と考え方
PDF
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
PDF
Jaspersoft Studioチュートリアル1 - レポートの作成
Jbatch実践入門 #jdt2015
Webアプリを並行開発する際のマイグレーション戦略
30分でわかるマイクロサービスアーキテクチャ 第2版
What's new in Spring Boot 2.6 ?
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
Javaのログ出力: 道具と考え方
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
Jaspersoft Studioチュートリアル1 - レポートの作成

What's hot (20)

PDF
Junitを使ったjavaのテスト入門
PDF
Test Yourself - テストを書くと何がどう変わるか
PDF
View customize pluginを使いこなす
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
KEY
やはりお前らのMVCは間違っている
PPTX
Apache Avro vs Protocol Buffers
PDF
Redmineをつかったスクラム開発のはじめの一歩
PDF
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
PPTX
Metaspace
PPTX
このPHP QAツールがすごい!2019
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
Railsで作るBFFの功罪
PDF
MyBatisとMyBatis Generatorの話
PDF
クラウド環境下におけるAPIリトライ設計
PDF
イミュータブルデータモデルの極意
PDF
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
PDF
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
Junitを使ったjavaのテスト入門
Test Yourself - テストを書くと何がどう変わるか
View customize pluginを使いこなす
コンテナの作り方「Dockerは裏方で何をしているのか?」
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
やはりお前らのMVCは間違っている
Apache Avro vs Protocol Buffers
Redmineをつかったスクラム開発のはじめの一歩
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
Metaspace
このPHP QAツールがすごい!2019
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Railsで作るBFFの功罪
MyBatisとMyBatis Generatorの話
クラウド環境下におけるAPIリトライ設計
イミュータブルデータモデルの極意
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
Spring Bootをはじめる時にやるべき10のこと
C#次世代非同期処理概観 - Task vs Reactive Extensions
Ad

Viewers also liked (19)

PDF
JSR 352 “Batch Applications for the Java Platform”
PDF
Java Batch 仕様 (Public Review時点)
PDF
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
PPTX
3.Java EE7 徹底入門 CDI&EJB
PDF
JJUG 11月ナイトセミナー CDIをはじめよう
PDF
日本Javaグループ2016年定期総会 #jjug #ccc_soukai
PDF
Java EE 再入門
PPTX
Spring I/O 2015 報告
PDF
AeroGear & Java EE 7 で簡単プッシュ
PDF
An introduction into Spring Data
PDF
Doma SQLテンプレートのしくみ
PDF
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」 #jjug_ccc #ccc_f3
PPTX
ついに始まるJava EE 7時代のアプリケーション開発
PDF
Spring Data JPA
PDF
Introduction to Cloud Foundry #JJUG
PDF
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
PDF
Astah Community スタートガイド
PDF
クロスプラットフォーム開発入門
PDF
Spring Bootで変わる Javaアプリ開発! #jsug
JSR 352 “Batch Applications for the Java Platform”
Java Batch 仕様 (Public Review時点)
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
3.Java EE7 徹底入門 CDI&EJB
JJUG 11月ナイトセミナー CDIをはじめよう
日本Javaグループ2016年定期総会 #jjug #ccc_soukai
Java EE 再入門
Spring I/O 2015 報告
AeroGear & Java EE 7 で簡単プッシュ
An introduction into Spring Data
Doma SQLテンプレートのしくみ
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」 #jjug_ccc #ccc_f3
ついに始まるJava EE 7時代のアプリケーション開発
Spring Data JPA
Introduction to Cloud Foundry #JJUG
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Astah Community スタートガイド
クロスプラットフォーム開発入門
Spring Bootで変わる Javaアプリ開発! #jsug
Ad

Similar to 20160215 04 java ee7徹底入門 jbatch (20)

PPT
Jtf13 ossジョブ管理システムによる運用自動化事例
PPTX
誰にでもできるパフォーマンスチューニング
PDF
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PDF
企業におけるSpring@日本springユーザー会20090624
PDF
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
PDF
What is doobie? - database access for scala -
PDF
JavaOne2015報告またはこれからのJava
PPTX
さくっと理解するSpring bootの仕組み
PDF
How do you like knockout?
PDF
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
PDF
JavaScriptと共に歩いて行く決意をした君へ
PDF
Zabbix-jp study #4 20111020 session2
PDF
Gwt+objectifyでラクラクGAEアプリ開発
PDF
脱・独自改造! GebでWebDriverをもっとシンプルに
PDF
JobScheduler Code Reading
PPTX
Dotnetconf2017
PDF
220523JS7.pdf
PDF
増加するコアを使い切れ!!
PDF
PythonのGUI_2018 with NSEG
PDF
JobStreamerではじめるJavaBatchのクラウド分散実行
Jtf13 ossジョブ管理システムによる運用自動化事例
誰にでもできるパフォーマンスチューニング
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
企業におけるSpring@日本springユーザー会20090624
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
What is doobie? - database access for scala -
JavaOne2015報告またはこれからのJava
さくっと理解するSpring bootの仕組み
How do you like knockout?
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
JavaScriptと共に歩いて行く決意をした君へ
Zabbix-jp study #4 20111020 session2
Gwt+objectifyでラクラクGAEアプリ開発
脱・独自改造! GebでWebDriverをもっとシンプルに
JobScheduler Code Reading
Dotnetconf2017
220523JS7.pdf
増加するコアを使い切れ!!
PythonのGUI_2018 with NSEG
JobStreamerではじめるJavaBatchのクラウド分散実行

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
  • 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 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. ジョブとステップとの分離 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 は、時代や言語を問わずに共通する バッチ処理の「ひな型」を提供 ステップ
  • 12. jBatch の構成要素と機能 122016/02/15 JJUG Night 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 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. ジョブオペレータの呼び出し方法 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 を用いた管理 画面の作成を紹介
  • 17. エラーハンドリング 172016/02/15 JJUG Night Seminar #JJUG ステップ 補助機能 ジョブ リトライ 再度そのデータの処理を試みる スキップ 該当データの処理を飛ばして、 次のデータへ処理を進める • データ処理中に例外が発生したらどうするか? • チャンク型ステップ (後述) の処理が対象 • 上記対処の対象とする例外クラスの名前を Job XML に記述しておく
  • 18. ステップ • 『チャンク型』 と 『バッチレット型』 の2種類 • チャンク型は “複数データの一括処理” を担う 182016/02/15 JJUG Night Seminar #JJUG ジョブ ステップ 補助機能 Batchlet データに依存しない処理やコマンド実行など ItemReader : データの読み込みに対応 バッチレット型 チャンク型 ItemProcessor : データの加工などの処理に対応 ItemWriter : データの書き込みに対応 複数データの 一括処理 単発の処理 協調 動作
  • 19. 書込みをまとめるこ とにより、物理的な I/O の回数を削減 性能上の効率と 障害発生時の やり直しのリスクとの 兼ね合いを図って いる チャンク型のステップ 192016/02/15 JJUG Night 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 Night Seminar #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 Night Seminar #JJUG ジョブ ステップ 補助機能 • コンテキスト – JobContext と StepContext の2種類 – プロパティやステータスなど、実行中のジョブ/ステップに 関する情報を API 経由で提供 – UserData として、ジョブ/ステップに横断的な 任意の値をセットすることもできる – Step の UserData は永続化可能
  • 25. 補助機能 252016/02/15 JJUG Night Seminar #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, 遷移要素の 活用例の紹介
  • 28. ステップ・パーティショニング 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> • ステップを任意のスレッド数で 並行して処理する機能 • 本書では紙幅と時間が尽きた ため割愛
  • 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 に期待しましょう