More Related Content Similar to JSR 352 “Batch Applications for the Java Platform” (20) More from Norito Agetsuma (14) JSR 352 “Batch Applications for the Java Platform”1. Java EE 7から加わるバッチ仕様
Batch Applications for
the Java Platform - JSR 352
GlassFish_jp 勉強会2013#1
2013/06/14
@n_agetsu
http://n-agetsuma.hatenablog.com
12. GlassFish_jp 勉強会2013#1
jbatch は Java EE 7 へ
Portable
Extensions
JSP 2.2 JSF 2.2
JAX-RS
2.0
EL 3.0
Servlet 3.1
Concurrency
Utilities for EE
Batch
Applications
(JSR 352)
Java API for JSON
(JSR-353)
Java API for
WebSocket
(JSR-355)
JSP2.2 JSP2.2 CDI 1.1
BeanValidation1.1
Managed Beans 1.0 EJB 3.2
Connector
1.0
JPA 2.1 JTA 1.1 JMS 2.0
が Java EE 7 で新たに盛り込まれる仕様
16. GlassFish_jp 勉強会2013#1
今日話さないこと
✗ 順序遷移の詳細な話
✗ <flow> <split> <decision>
✗ エラーハンドリングの詳細な話
✗ <skippable-exception-classes>
✗ <retryable-exception-classes>
✗ 並行処理の話
✗ Step partitioning
✗ 並列実行プラン : <plan partition=”3”>
Java Day Tokyoのセッションで触れている箇所があるため、
是非Java Day Tokyoの資料を参照してください。
19. jbatch 仕様 3つの構成
GlassFish_jp 勉強会2013#1
1. バッチ用語と関連性の定義 (DSL)
JobOperator Job Step
JobRepository
ItemReader
<job id="samplejob">
<step id="step1"/>
</job>
2. ジョブXMLの定義 3. APIの定義
public interface ItemReader {
Object readItem(Object item);
}
ItemProcessor
ItemWriter
20. jbatch 仕様 3つの構成
GlassFish_jp 勉強会2013#1
1. バッチ用語と関連性の定義 (DSL)
<job id="samplejob">
<step id="step1"/>
</job>
2. ジョブXMLの定義 3. APIの定義
public interface ItemReader {
Object readItem(Object item);
}
どのような構成で作るのか
(アーキテクチャ定義)
JobOperator Job Step
JobRepository
ItemReader
ItemProcessor
ItemWriter
21. jbatch 仕様 3つの構成
GlassFish_jp 勉強会2013#1
<job id="samplejob">
<step id="step1"/>
</job>
2. ジョブXMLの定義 3. APIの定義
public interface ItemReader {
Object readItem(Object item);
}
1. バッチ用語と関連性の定義 (DSL)
JobOperator Job Step
JobRepository
ItemReader
ItemProcessor
ItemWriter
アーキテクチャをどうやって
実装するか(XML/API 定義)
29. jbatch
jbatchの機能3 - エラーハンドリング
GlassFish_jp 勉強会2013#1
壊れたデータをスキップして処理を継続することができる
No msg
001 I love GlassFish4.
002 I love Java EE 7.
999999
99999
Bad Record.
004 I love modern framework.
success
success
skip
success
36. データベース
ファイル
(CSV/XML 等)
GlassFish_jp 勉強会2013#1
Java EE サーバ
ユーザアプリケーション
jbatch
JTACDI
JAX-RS2.0
EJB/JPA...
Cron
時刻起動
http post http://localhost:8080/batch/jobs/1@Path("/jobs/{jobId}")
public class BatchResource {
@POST
public void start(
@PathParam("jobId") String jobId) {
// バッチジョブの起動
JobOperator jobOperator =
BatchRuntime.getJobOperator();
jobOperator.start(jobId, null);
}
}
40. ジョブ : トップレベル要素
GlassFish_jp 勉強会2013#1
✗ ジョブは1つ以上のステップから構成
✗ ステップ全体に関わる設定はジョブに設定
✗ リスタート可能かどうか? ジョブ設定プロパティ 等
JobOperator
Step2
JobRepository
Item
Reader
Item
Processor
Item
Writer
Step1 Step3
Job
batchlet
41. ジョブ : トップレベル要素
GlassFish_jp 勉強会2013#1
✗ ジョブは1つ以上のステップから構成
✗ ステップ全体に関わる設定はジョブに設定
✗ リスタート可能かどうか? ジョブ設定プロパティ 等
JobOperator
Step2
JobRepository
ItemReader ItemProcessor ItemWriter
Step1 Step3
Job
<job id="samplejob">
<step id="step1" next="step2" />
<step id="step2" />
<properties>
<property name="filePath" value="input.txt">
</properties>
</job>
42. ジョブ : トップレベル要素
GlassFish_jp 勉強会2013#1
✗ ジョブは1つ以上のステップから構成
✗ ステップ全体に関わる設定はジョブに設定
✗ リスタート可能かどうか? ジョブ設定プロパティ 等
JobOperator
Step2
JobRepository
ItemReader ItemProcessor ItemWriter
Step1 Step3
Job
<job id="samplejob">
<step id="step1" next="step2" />
<step id="step2" />
<properties>
<property name="filePath" value="input.txt">
</properties>
</job>
ジョブID. 必須属性. 一意の識別子を設定.
JobOperator.start(“samplejob”, null);
43. ジョブ : トップレベル要素
GlassFish_jp 勉強会2013#1
✗ ジョブは1つ以上のステップから構成
✗ ステップ全体に関わる設定はジョブに設定
✗ リスタート可能かどうか? ジョブ設定プロパティ 等
JobOperator
Step2
JobRepository
ItemReader ItemProcessor ItemWriter
Step1 Step3
Job
<job id="samplejob">
<step id="step1" next="step2" />
<step id="step2" />
<properties>
<property name="filePath" value="input.txt">
</properties>
</job>
ステップの流れを定義する.
最低1つ以上のステップが必要.
44. ジョブ : トップレベル要素
GlassFish_jp 勉強会2013#1
✗ ジョブは1つ以上のステップから構成
✗ ステップ全体に関わる設定はジョブに設定
✗ リスタート可能かどうか? ジョブ設定プロパティ 等
JobOperator
Step2
JobRepository
ItemReader ItemProcessor ItemWriter
Step1 Step3
Job
<job id="samplejob">
<step id="step1" next="step2" />
<step id="step2" />
<properties>
<property name="filePath" value="input.txt">
</properties>
</job>
ジョブ全体で使うプロパティ.
オプション要素.
47. ステップ : ジョブに含まれるタスク
✗ 各ステップの処理内容はユーザがコーディングする
✗ ステップの実装方法
✗ chunk方式 : reader processor writer を実装
✗ batchlet方式 : batchletインタフェース のみ実装
JobOperator
Step2
JobRepository
Item
Reader
Item
Processor
Item
Writer
Step1 Step3
Job
batchlet
GlassFish_jp 勉強会2013#1
49. STEP ItemReader Item
Processor ItemWriter
ItemReader 実装方法
GlassFish_jp 勉強会2013#1
@Named
public class MyReader implements ItemReader {
@Override
public void open(Serializable checkPoint)
throws Exception {..}
@Override
public Object readItem() throws Exception {..}
@Override
public void close() throws Exception {..}
...
}
51. ItemWriter
ItemWriter の実装方法
GlassFish_jp 勉強会2013#1
STEP ItemReader Item
Processor
@Named
public class MyWriter implements ItemWriter {
@Override
public void open(Serializable checkPoint)
throws Exception {..}
@Override
public Object writeItems(List<Object> items)
throws Exception {..}
@Override
public void close() throws Exception {..}
...
}
56. STEP ItemReader Item
Processor ItemWriter
同じく1件処理する
GlassFish_jp 勉強会2013#1
open
open
readItem
item
processItem(item)
result
readItem
item
processItem(item)
result
57. STEP ItemReader Item
Processor ItemWriter
chunk処理ではすぐに書き出さない
GlassFish_jp 勉強会2013#1
open
open
readItem
item
processItem(item)
result
readItem
item
processItem(item)
result
1アイテム目の
読み込みと処理
2アイテム目の
...
デフォルトで10回、
読み込みと処理を繰り返す。
60. STEP ItemReader Item
Processor ItemWriter
chunk方式のゆえん
GlassFish_jp 勉強会2013#1
readItem
item
processItem(item)
result
writeItems(results)
10個ずつ纏めて塊を処理しているので、
chunk(塊)方式と呼ばれる。
61. STEP ItemReader Item
Processor ItemWriter
書いたらcheckpointを実行
GlassFish_jp 勉強会2013#1
readItem
item
processItem(item)
result
checkpointInfo
Checkpoint
data
writeItems(results)
Chunkの書き出しが終わると、
コミット前にcheckpointInfoが実行。
checkpointInfo
62. STEP ItemReader Item
Processor ItemWriter
checkpointInfoの実装
GlassFish_jp 勉強会2013#1
readItem
item
processItem(item)
result
◀ comit
writeItems(results)
checkpointInfo
Checkpoint
data
checkpointInfo
@Named
public class MyReader implements ItemReader {
@Override
public void open(Serializable checkPoint)
throws Exception {..}
@Override
public Serializable checkpointInfo()
throws Exception {
// 読み込んだ行数をチェックポイントにする
return readedCount; // => 10
}
}
66. スタートとリスタートは違う
GlassFish_jp 勉強会2013#1
// バッチジョブの起動
JobOperator jobOperator = BatchRuntime.getJobOperator();
long jobExecId = jobOperator.start(“myjob”, null);
// ジョブのリスタート
long jobExecId = jobOperator.restart(jobExecId, null);
restart で起動すると、
open(Serializable cp) に
checkpointInfo()で返された値が渡される。
通常のstartでは、nullが常に渡される。
67. STEP ItemReader Item
Processor ItemWriter
書いたらcheckpointを実行
GlassFish_jp 勉強会2013#1
readItem
item
processItem(item)
result
checkpointInfo
Checkpoint
data
writeItems(results)
checkpointが終わったら、
バッチランタイムは commit する。
(GlassFish であればJTAトランザクション)
checkpointInfo
◀ comit
71. STEP ItemReader Item
Processor ItemWriter
チェックポイントを実行する
GlassFish_jp 勉強会2013#1
readItem
null
writeItems(results)
checkpointInfo
checkpoint
checkpointInfo
checkpoint
72. STEP ItemReader Item
Processor ItemWriter
トランザクションをコミットする
GlassFish_jp 勉強会2013#1
readItem
null
writeItems(results)
checkpointInfo
checkpoint
checkpointInfo
checkpoint
◀ comit
73. STEP ItemReader Item
Processor ItemWriter
コミット後は close 処理
GlassFish_jp 勉強会2013#1
◀ comit
close
close
ItemReaderとItemWriterのclose処理して
chunk方式のステップは完了。
74. chunk方式 : job.xml (スキーマ指定削除)
GlassFish_jp 勉強会2013#1
<?xml version="1.0" encoding="UTF-8"?>
<job xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="1.0" id="job1">
<step>
<chunk item-count="100">
<reader ref="myReader"/>
<processor ref="myProcessor"/>
<writer ref="myWriter"/>
</chunk>
</step>
</job>
75. chunk方式 : chunkタグとオプション
GlassFish_jp 勉強会2013#1
Stepの子要素としてchunkを定義。
コミット間隔チューニングは、item-count属性。
デフォルトは10。
<?xml version="1.0" encoding="UTF-8"?>
<job xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="1.0" id="job1">
<step>
<chunk item-count="100">
<reader ref="myReader"/>
<processor ref="myProcessor"/>
<writer ref="myWriter"/>
</chunk>
</step>
</job>
76. chunk方式 : reader/processor/writer
GlassFish_jp 勉強会2013#1
ItemReader ItemProcessor ItemWriter の
クラス名の先頭を小文字にして定義する。
<?xml version="1.0" encoding="UTF-8"?>
<job xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="1.0" id="job1">
<step>
<chunk item-count="100">
<reader ref="myReader"/>
<processor ref="myProcessor"/>
<writer ref="myWriter"/>
</chunk>
</step>
</job>
81. @Named
public class MyItemReader {
@ReadItem
Object read() throws Exception {
// レコード読み取り処理
}
}
GlassFish_jp 勉強会2013#1
アノテーションでItemReaderが定義できた
今後盛り込まれることを期待。
82. process()
ExitStatus
もう1つのStep実装方式 : batchlet
GlassFish_jp 勉強会2013#1
STEP batchlet
public class MyBatchlet implements Batchlet {
@Override
public String process() throws Exception {
// 処理をここに実装
}
@Override
public void stop() throws Exception {
// JobOperator.stop()で強制停止した時の
// 処理をここに実装
}
}
Stepとbatchletが1対1。非常にシンプルな実装。
<step id="step1">
<batchlet ref="myBatchlet" />
</step>
85. GlassFish_jp 勉強会2013#1
JobRepository : 永続化機構
JobOperator
Step2
JobRepository
Item
Reader
Item
Processor
Item
Writer
Step1 Step3
Job
batchlet
✗ ジョブインスタンスやチェックポイント情報を保存
✗ 仕様上ではあまり詳細については言及されず
✗ Glassfish4 同梱のRIでは組み込みderbyに永続化
88. Spring Batch と jbatch
GlassFish_jp 勉強会2013#1
基本的な作り
jbatch Spring Batch
XMLベース
(ジョブXML)
XMLベース
(ジョブXML)
ユーリティ
クラスの充実
現状はなし
(シンプルに標準化)
ファイル操作サポート
JPA連携サポート
複数サーバ
分散処理なし あり
JSR準拠標準仕様
(ベンダフリー)
現状は未準拠
92. Java SE 環境と EE環境の違い
GlassFish_jp 勉強会2013#1
トランザク
ション
Java SE Java EE
ローカル
トランザクション
JTA
トランザクション
必要な
設定ファイル
ランタイム実装に
依存
Concurrency
Utilities for JavaEE
(コンテナ管理スレッド)
スレッド
プール
・ /META-INF/batch-jobs/
job.xml
・/META-INF/batch.xml
/META-INF/batch-jobs/
job.xml
Java EE 環境で使った方が良いと思います。
94. GlassFish_jp 勉強会2013#1
java.net から情報収集
✗ 仕様書を読む
✗ http://jcp.org/aboutJava/communityprocess/final/jsr352/index.html
✗ Java EE 7 チュートリアルを読む
✗ http://docs.oracle.com/javaee/7/tutorial/doc/home.htm
✗ GlassFish4 を動かしてみる
✗ GlassFish4にはRIが同梱済み
✗ Java SEで動かす場合は java.net からダウンロード
https://java.net/projects/jbatch/downloads/download/jsr352-SE-RI-1.0-2013.04.22.zip