97
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

JSR 352 “Batch Applications for the Java Platform”

Embed Size (px)

DESCRIPTION

GlassFish_JP 2013#01 のセッション資料です。

Citation preview

Page 1: JSR 352 “Batch Applications for the Java Platform”

Java EE 7から加わるバッチ仕様Batch Applications for the Java Platform - JSR 352

GlassFish_jp 勉強会2013#12013/06/14

@n_agetsuhttp://n-agetsuma.hatenablog.com

Page 2: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

自己紹介

上妻 宜人 (あげつま のりと)✗ 電話の裏側を作っている会社で働いています.✗ APサーバなどの社内技術サポートを担当.✗ Java Batch は Public Review あたりから 楽しみながら眺めていました.

Page 3: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

バッチってなんだろう?

Page 4: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

深夜に起動(非対話型)

ジョブ

計算量が多い

順序制御 並列実行

月次締め処理

銀行勘定システム 在庫管理

Page 5: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

深夜に起動(非対話型)

ジョブ

計算量が多い

順序制御 並列実行

月次締め処理

銀行勘定システム 在庫管理

多くの業種にバッチ処理(会計 金融 流通 ...)

Page 6: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

深夜に起動(非対話型)

ジョブ

計算量が多い

順序制御 並列実行

月次締め処理

銀行勘定システム 在庫管理業種は違えど、

処理の背景は同じ

Page 7: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

深夜に起動(非対話型)

ジョブ

計算量が多い

順序制御 並列実行

月次締め処理

銀行勘定システム 在庫管理

バッチに求められる機能も業種をまたがって同じ

Page 8: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

異なる業種が

類似の処理の背景を持って、

同じような機能を作る

Page 9: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

D R Y !!!同じことを何度も繰り返すべからず

Page 10: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

標準化しよう

スペックリード

http://www.beyondnlptraining.co.uk/wp-content/uploads/2013/03/leadership.jpg

Page 11: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

JSR352

Batch Application forThe Java Platform

Page 12: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

jbatch は Java EE 7 へ

PortableExtensions

JSP 2.2 JSF 2.2JAX-RS

2.0 EL 3.0

Servlet 3.1

ConcurrencyUtilities for EE

BatchApplications

(JSR 352)

Java API for JSON(JSR-353)

Java API forWebSocket(JSR-355)

JSP2.2 JSP2.2 CDI 1.1

Be

an V

al idat io

n 1.1

Managed Beans 1.0 EJB 3.2

Connector1.0 JPA 2.1 JTA 1.1 JMS 2.0

が Java EE 7 で新たに盛り込まれる仕様

Page 13: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

正式な仕様名は(Batch Application for the java Platform)

とても長いので、

Page 14: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

ここからは jbatch で.

Page 15: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

今日話すこと

✗ jbatch の概要✗ アーキテクチャ

✗ ユーザは何を実装するのか✗ chunk方式の処理の流れ

✗ Spring Batchとの違い✗ Java SE / EE の違い

Page 16: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

今日話さないこと✗ 順序遷移の詳細な話

✗ <flow> <split> <decision>

✗ エラーハンドリングの詳細な話✗ <skippable-exception-classes>✗ <retryable-exception-classes>

✗ 並行処理の話✗ Step partitioning✗ 並列実行プラン : <plan partition=”3”>

Java Day Tokyoのセッションで触れている箇所があるため、是非Java Day Tokyoの資料を参照してください。

Page 17: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

jbatch の概要

Page 18: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

✗ jbatch って何が仕様化されてるの?✗ どんなことができるの?

Page 19: JSR 352 “Batch Applications for the Java Platform”

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

Page 20: JSR 352 “Batch Applications for the Java Platform”

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

Page 21: JSR 352 “Batch Applications for the Java Platform”

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 定義)

Page 22: JSR 352 “Batch Applications for the Java Platform”

jbatchの機能1 - 順序制御ジョブXMLで処理の順序を定義することができる

STEP1STEP2-1

Flow1STEP2-2

Decision (分岐)

STEP3-1Sp

lit

Flow

FlowFlow

Split (並行実行)

start

end

GlassFish_jp 勉強会2013#1

Flow (グループ化)

Page 23: JSR 352 “Batch Applications for the Java Platform”

start endcommit

10行処理 障害発生

GlassFish_jp 勉強会2013#1

デフォルトでは10レコードごとにコミットされる

jbatchの機能2 - チェックポイント

commit▼

10行処理… ×

ロールバックは最終コミットまで

途中からでリスタートも可能

Page 24: JSR 352 “Batch Applications for the Java Platform”

jbatch

jbatchの機能3 - エラーハンドリング

GlassFish_jp 勉強会2013#1

壊れたデータをスキップして処理を継続することができる

No msg

001 I love GlassFish4.002 I love Java EE 7.99999999999 Bad Record.004 I love modern framework.

success

Page 25: JSR 352 “Batch Applications for the Java Platform”

jbatch

jbatchの機能3 - エラーハンドリング

GlassFish_jp 勉強会2013#1

壊れたデータをスキップして処理を継続することができる

No msg

001 I love GlassFish4.002 I love Java EE 7.99999999999 Bad Record.004 I love modern framework.

success

Page 26: JSR 352 “Batch Applications for the Java Platform”

jbatch

jbatchの機能3 - エラーハンドリング

GlassFish_jp 勉強会2013#1

壊れたデータをスキップして処理を継続することができる

No msg

001 I love GlassFish4.002 I love Java EE 7.99999999999 Bad Record.004 I love modern framework.

Page 27: JSR 352 “Batch Applications for the Java Platform”

jbatch

jbatchの機能3 - エラーハンドリング

GlassFish_jp 勉強会2013#1

壊れたデータをスキップして処理を継続することができる

No msg

001 I love GlassFish4.002 I love Java EE 7.99999999999 Bad Record.004 I love modern framework.

error

Page 28: JSR 352 “Batch Applications for the Java Platform”

jbatch

jbatchの機能3 - エラーハンドリング

GlassFish_jp 勉強会2013#1

壊れたデータをスキップして処理を継続することができる

No msg

001 I love GlassFish4.002 I love Java EE 7.99999999999 Bad Record.004 I love modern framework.

Skip

Page 29: JSR 352 “Batch Applications for the Java Platform”

jbatch

jbatchの機能3 - エラーハンドリング

GlassFish_jp 勉強会2013#1

壊れたデータをスキップして処理を継続することができる

No msg

001 I love GlassFish4.002 I love Java EE 7.99999999999 Bad Record.004 I love modern framework.

success

success

skip

success

Page 30: JSR 352 “Batch Applications for the Java Platform”

ジョブスケジューラ(cron/JP1/Tivoliなど)

スケジューリング(時刻・周期起動)

実行権限の管理

GlassFish_jp 勉強会2013#1

ジョブスケジューラ と jbatch

ジョブ実行順序管理JP1:ジョブネット

Page 31: JSR 352 “Batch Applications for the Java Platform”

ジョブスケジューラ(cron/JP1/Tivoliなど)

スケジューリング(時刻・周期起動)

ジョブ実行順序管理JP1:ジョブネット

jbatch:ジョブ定義XML

実行権限の管理

GlassFish_jp 勉強会2013#1

ジョブスケジューラ と jbatch

jbatch

ジョブ実装サポート(API/例外制御)

Page 32: JSR 352 “Batch Applications for the Java Platform”

スケジューリング(時刻・周期起動)

実行権限の管理

GlassFish_jp 勉強会2013#1

ジョブスケジューラ と jbatch

jbatch

ジョブ実装サポート(API/例外制御)

jbatchはスケジューリング機能を持っていない。

ジョブ実行順序管理JP1:ジョブネット

jbatch:ジョブ定義XML

ジョブスケジューラ(cron/JP1/Tivoliなど)

Page 33: JSR 352 “Batch Applications for the Java Platform”

スケジューリング(時刻・周期起動)

ジョブ実行順序管理JP1:ジョブネット

jbatch:ジョブ定義XML

実行権限の管理

GlassFish_jp 勉強会2013#1

ジョブスケジューラ と jbatch

jbatch

ジョブ実装サポート(API/例外制御)

被る部分は使い分けを整理する必要がある。

ジョブスケジューラ(cron/JP1/Tivoliなど)

Page 34: JSR 352 “Batch Applications for the Java Platform”

データベース

ファイル(CSV/XML 等)

jbatch の位置付け

GlassFish_jp 勉強会2013#1

Java EE サーバ

ユーザアプリケーション

jbatch

JTACDI

JAX

-RS

2.0

EJB/JPA...

Cron

他のJava EE 仕様と同様にAPIを提供するのが役割

APIの利用

Page 35: JSR 352 “Batch Applications for the Java Platform”

データベース

ファイル(CSV/XML 等)

jbatch を起動する

GlassFish_jp 勉強会2013#1

Java EE サーバ

ユーザアプリケーション

jbatch

JTACDI

JAX

-RS

2.0

EJB/JPA...

Cron

時刻起動

http post http://localhost:8080/batch/job/1

Page 36: JSR 352 “Batch Applications for the Java Platform”

データベース

ファイル(CSV/XML 等)

GlassFish_jp 勉強会2013#1

Java EE サーバ

ユーザアプリケーション

jbatch

JTACDI

JAX

-RS

2.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); }}

Page 37: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

Java EE のコードから簡単にバッチ起動が可能です。(JAX-RS EJB Servlet 等)

Page 38: JSR 352 “Batch Applications for the Java Platform”

アーキテクチャ

GlassFish_jp 勉強会2013#1

Page 39: JSR 352 “Batch Applications for the Java Platform”

アーキテクチャ

GlassFish_jp 勉強会2013#1

✗ メインフレームのバッチを移行させるため、✗ JCLやCOBOL開発者にも馴染みやすく

JobOperatorStep2

JobRepository

ItemReader

ItemProcessor

ItemWriter

Step1 Step3

Job

batchlet

Page 40: JSR 352 “Batch Applications for the Java Platform”

ジョブ : トップレベル要素

GlassFish_jp 勉強会2013#1

✗ ジョブは1つ以上のステップから構成✗ ステップ全体に関わる設定はジョブに設定✗ リスタート可能かどうか? ジョブ設定プロパティ 等

JobOperatorStep2

JobRepository

ItemReader

ItemProcessor

ItemWriter

Step1 Step3

Job

batchlet

Page 41: JSR 352 “Batch Applications for the Java Platform”

ジョブ : トップレベル要素

GlassFish_jp 勉強会2013#1

✗ ジョブは1つ以上のステップから構成✗ ステップ全体に関わる設定はジョブに設定✗ リスタート可能かどうか? ジョブ設定プロパティ 等

JobOperatorStep2

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>

Page 42: JSR 352 “Batch Applications for the Java Platform”

ジョブ : トップレベル要素

GlassFish_jp 勉強会2013#1

✗ ジョブは1つ以上のステップから構成✗ ステップ全体に関わる設定はジョブに設定✗ リスタート可能かどうか? ジョブ設定プロパティ 等

JobOperatorStep2

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);

Page 43: JSR 352 “Batch Applications for the Java Platform”

ジョブ : トップレベル要素

GlassFish_jp 勉強会2013#1

✗ ジョブは1つ以上のステップから構成✗ ステップ全体に関わる設定はジョブに設定✗ リスタート可能かどうか? ジョブ設定プロパティ 等

JobOperatorStep2

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つ以上のステップが必要.

Page 44: JSR 352 “Batch Applications for the Java Platform”

ジョブ : トップレベル要素

GlassFish_jp 勉強会2013#1

✗ ジョブは1つ以上のステップから構成✗ ステップ全体に関わる設定はジョブに設定✗ リスタート可能かどうか? ジョブ設定プロパティ 等

JobOperatorStep2

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>

ジョブ全体で使うプロパティ.オプション要素.

Page 45: JSR 352 “Batch Applications for the Java Platform”

Job

JobInstance

JobExecution

『ファイル取り込み』ジョブ

2013/06/14 に実行する『ファイル取り込み』ジョブ

JobExecution

JobInstance

ジョブインスタンスの考え方✗ スケジュールごとにJobInstanceが生成される✗ 実行ごとにJobExecutionが生成される✗ JobInstanceは再実行に備えて永続化(シリアライズ)

GlassFish_jp 勉強会2013#1

2013/06/14 に実行する『ファイル取り込み』ジョブ の1回目

Page 46: JSR 352 “Batch Applications for the Java Platform”

ジョブインスタンスが永続化される訳✗ 6/14のジョブインスタンスは、6/15に再実行しても、 6/14分のデータにアクセスする。

✗ 対象データが異なる場合は、前日のリスタート分と 当日分のジョブを並行処理させることも可能。

JobInstance

JobExecution

JobExecution

6月14日分のジョブ

6/14 1回目の実行(失敗)

再開時も6/14分のデータを処理

実行インスタンスは実行毎に生成

date sales amount

6/14 ¥30,0006/14 ¥25,0006/15 ¥43,000

6/15 6/14分リスタート

売上テーブル

GlassFish_jp 勉強会2013#1

Page 47: JSR 352 “Batch Applications for the Java Platform”

ステップ : ジョブに含まれるタスク✗ 各ステップの処理内容はユーザがコーディングする✗ ステップの実装方法

✗ chunk方式 : reader processor writer を実装✗ batchlet方式 : batchletインタフェース のみ実装

JobOperatorStep2

JobRepository

ItemReader

ItemProcessor

ItemWriter

Step1 Step3

Job

batchlet

GlassFish_jp 勉強会2013#1

Page 48: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

chunk方式 の登場人物

GlassFish_jp 勉強会2013#1

Page 49: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

ItemReader 実装方法

GlassFish_jp 勉強会2013#1

@Namedpublic class MyReader implements ItemReader { @Override public void open(Serializable checkPoint) throws Exception {..}

@Override public Object readItem() throws Exception {..}

@Override public void close() throws Exception {..} ...}

Page 50: JSR 352 “Batch Applications for the Java Platform”

ItemReader ItemProcessor

ItemProcessor 実装方法

GlassFish_jp 勉強会2013#1

@Namedpublic class MyProcessor implements ItemProcessor {

@Override public Object processItem(Object item) throws Exception {..}

}

STEP ItemWriter

Page 51: JSR 352 “Batch Applications for the Java Platform”

ItemWriter

ItemWriter の実装方法

GlassFish_jp 勉強会2013#1

STEP ItemReader ItemProcessor

@Namedpublic 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 {..} ...}

Page 52: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

まずはオープンする

GlassFish_jp 勉強会2013#1

open

open

Page 53: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

アイテムを1件読む

GlassFish_jp 勉強会2013#1

open

open

readItemitem

Page 54: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

アイテムを1件処理する

GlassFish_jp 勉強会2013#1

open

open

readItemitem

processItem(item)

result

Page 55: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

次の1件を読みにいく

GlassFish_jp 勉強会2013#1

open

open

readItemitem

processItem(item)

result

readItemitem

Page 56: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

同じく1件処理する

GlassFish_jp 勉強会2013#1

open

open

readItemitem

processItem(item)

result

readItemitem

processItem(item)

result

Page 57: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

chunk処理ではすぐに書き出さない

GlassFish_jp 勉強会2013#1

open

open

readItemitem

processItem(item)

result

readItemitem

processItem(item)

result

1アイテム目の読み込みと処理

2アイテム目の...

デフォルトで10回、読み込みと処理を繰り返す。

Page 58: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

10アイテム目の処理が終わると

GlassFish_jp 勉強会2013#1

readItemitem

processItem(item)

result

10アイテム目の読み込みと処理

Page 59: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

まとめて書き込み処理を行う

GlassFish_jp 勉強会2013#1

readItemitem

processItem(item)

result

writeItems(results)

Page 60: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

chunk方式のゆえん

GlassFish_jp 勉強会2013#1

readItemitem

processItem(item)

result

writeItems(results)

10個ずつ纏めて塊を処理しているので、chunk(塊)方式と呼ばれる。

Page 61: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

書いたらcheckpointを実行

GlassFish_jp 勉強会2013#1

readItemitem

processItem(item)

result

checkpointInfo

Checkpointdata

writeItems(results)

Chunkの書き出しが終わると、コミット前にcheckpointInfoが実行。

checkpointInfo

Page 62: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

checkpointInfoの実装

GlassFish_jp 勉強会2013#1

readItemitem

processItem(item)

result

◀ comit

writeItems(results)

checkpointInfo

Checkpointdata

checkpointInfo

@Namedpublic class MyReader implements ItemReader { @Override public void open(Serializable checkPoint) throws Exception {..}

@Overridepublic Serializable checkpointInfo()

throws Exception { // 読み込んだ行数をチェックポイントにする

return readedCount; // => 10}

}

Page 63: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

チェックポイントはリスタート時に使われる。

Page 64: JSR 352 “Batch Applications for the Java Platform”

スタートとリスタートは違う

GlassFish_jp 勉強会2013#1

// バッチジョブの起動JobOperator jobOperator = BatchRuntime.getJobOperator();long jobExecId = jobOperator.start(“myjob”, null);

// ジョブのリスタートlong jobExecId = jobOperator.restart(jobExecId, null);

初回起動時はjob.xmlの<job id=”myjob”> のid文字列を指定する。

Page 65: JSR 352 “Batch Applications for the Java Platform”

スタートとリスタートは違う

GlassFish_jp 勉強会2013#1

// バッチジョブの起動JobOperator jobOperator = BatchRuntime.getJobOperator();long jobExecId = jobOperator.start(“myjob”, null);

// ジョブのリスタートlong jobExecId = jobOperator.restart(jobExecId, null);

リスタートするときは restart で起動する。初回起動時に取得したジョブ実行ID(long)を引数に指定する。

Page 66: JSR 352 “Batch Applications for the Java Platform”

スタートとリスタートは違う

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が常に渡される。

Page 67: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

書いたらcheckpointを実行

GlassFish_jp 勉強会2013#1

readItemitem

processItem(item)

result

checkpointInfo

Checkpointdata

writeItems(results)

checkpointが終わったら、バッチランタイムは commit する。(GlassFish であればJTAトランザクション)

checkpointInfo

◀ comit

Page 68: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

chunk処理終了時の流れ

GlassFish_jp 勉強会2013#1

readItem

読込対象のデータがなくなった!

Page 69: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

chunk処理終了時の流れ

GlassFish_jp 勉強会2013#1

readItem

ItemReaderから null を返す。null

Page 70: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

writeItemsを実行する

GlassFish_jp 勉強会2013#1

readItem

処理済みの分を書き出す。

null

writeItems(results)

Page 71: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

チェックポイントを実行する

GlassFish_jp 勉強会2013#1

readItemnull

writeItems(results)

checkpointInfo

checkpoint

checkpointInfocheckpoint

Page 72: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

トランザクションをコミットする

GlassFish_jp 勉強会2013#1

readItemnull

writeItems(results)

checkpointInfo

checkpoint

checkpointInfocheckpoint

◀ comit

Page 73: JSR 352 “Batch Applications for the Java Platform”

STEP ItemReader ItemProcessor ItemWriter

コミット後は close 処理

GlassFish_jp 勉強会2013#1

◀ comitclose

close

ItemReaderとItemWriterのclose処理してchunk方式のステップは完了。

Page 74: JSR 352 “Batch Applications for the Java Platform”

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>

Page 75: JSR 352 “Batch Applications for the Java Platform”

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>

Page 76: JSR 352 “Batch Applications for the Java Platform”

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>

Page 77: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

全てのメソッドの実装を強制されると困ります...(open close処理がない など)

F A Q

Page 78: JSR 352 “Batch Applications for the Java Platform”

空実装されたAbstractReaderを継承

GlassFish_jp 勉強会2013#1

public class MyReader extends AbstractItemReader { @Override public Object readItem() throws Exception { // read処理の実装 }}

✗ デフォルト実装は空実装 (何もしない)✗ openやcloseが呼ばれても何もしない

Page 79: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

Abstractクラスを使うと、他クラスを継承できないので困る

(POJOが一番嬉しい...)

F A Q

Page 80: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

public review まではこんなのもあった!

Page 81: JSR 352 “Batch Applications for the Java Platform”

@Namedpublic class MyItemReader { @ReadItem Object read() throws Exception { // レコード読み取り処理 }}

GlassFish_jp 勉強会2013#1

アノテーションでItemReaderが定義できた

今後盛り込まれることを期待。

Page 82: JSR 352 “Batch Applications for the Java Platform”

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>

Page 83: JSR 352 “Batch Applications for the Java Platform”

chunkとbatchletの使い分け

GlassFish_jp 勉強会2013#1

✗ Chunk方式✗ バルクオペレーション全般✗ ファイル、DBレコードを1件ずつ処理

✗ batchlet方式✗ コマンド処理全般✗ 他サーバへのファイル転送 (ftpなど)✗ 圧縮 解凍コマンドの実行

Page 84: JSR 352 “Batch Applications for the Java Platform”

JobOperatorStep2

JobRepository

ItemReader

ItemProcessor

ItemWriter

Step1 Step3

Job

batchlet

GlassFish_jp 勉強会2013#1

JobOperator

✗ バッチ処理のコントロール役✗ JobOperator経由でジョブ起動/再起動/停止

Page 85: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

JobRepository : 永続化機構

JobOperatorStep2

JobRepository

ItemReader

ItemProcessor

ItemWriter

Step1 Step3

Job

batchlet

✗ ジョブインスタンスやチェックポイント情報を保存✗ 仕様上ではあまり詳細については言及されず✗ Glassfish4 同梱のRIでは組み込みderbyに永続化

Page 86: JSR 352 “Batch Applications for the Java Platform”

アーキテクチャの振り返り

GlassFish_jp 勉強会2013#1

✗ Jobには1つ以上のStepが含まれる✗ JobやStepはXMLで表現する✗ Stepの実装方法は2つある

✗ chunk : 読む/処理/書くを繰り返す処理向き✗ batchlet : コマンド向き

✗ chunk/batchletはjavaで実装する✗ JobOperatorからジョブを起動する✗ JobRepositoryにジョブ情報は永続化される

Page 87: JSR 352 “Batch Applications for the Java Platform”

Spring Batch と jbatch

GlassFish_jp 勉強会2013#1

Page 88: JSR 352 “Batch Applications for the Java Platform”

Spring Batch と jbatch

GlassFish_jp 勉強会2013#1

基本的な作り

jbatch Spring BatchXMLベース

(ジョブXML)XMLベース

(ジョブXML)ユーリティ

クラスの充実現状はなし

(シンプルに標準化) ファイル操作サポートJPA連携サポート

複数サーバ分散処理なし あり

JSR準拠標準仕様(ベンダフリー) 現状は未準拠

Page 89: JSR 352 “Batch Applications for the Java Platform”

Spring Batchがjbatch実装になる?!

GlassFish_jp 勉強会2013#1

✗ Java EEになるべく依存しない気配を感じる✗ 依存するDIコンテナをCDIに限定していない✗ 仕様書上もSpringやGuiceのキーワードあり

✗ 似ているので、Spring Batchは仕様準拠しやすい✗ Expert GroupにVMWare社もいる

現状は、SpringBatchから汎用部分を標準化したのがjbatch

Page 90: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

Java Batch 動作環境

Page 91: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

対応しているJDK

JDK6 以上(もうサポート切れなので、是非JDK7を)

Page 92: JSR 352 “Batch Applications for the Java Platform”

Java SE 環境と EE環境の違い

GlassFish_jp 勉強会2013#1

トランザクション

Java SE Java EEローカル

トランザクションJTA

トランザクション

必要な設定ファイル

ランタイム実装に依存

ConcurrencyUtilities for JavaEE(コンテナ管理スレッド)

スレッドプール

・ /META-INF/batch-jobs/ job.xml・/META-INF/batch.xml

/META-INF/batch-jobs/job.xml

Java EE 環境で使った方が良いと思います。

Page 93: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

もっと jbatch を知る

Page 94: JSR 352 “Batch Applications for the Java Platform”

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

Page 95: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

書籍で学ぶ

✗ Spring Batchと異なる点もあるので注意✗ batchlet -> tasklet✗ reader をchunkタグの属性で定義<reader> -> reader=”...”

✗ 実装の実践的な例として役立つ本✗ 英語だけど怖くない

Page 96: JSR 352 “Batch Applications for the Java Platform”

GlassFish_jp 勉強会2013#1

サンプルアプリ作ってみたhttps://github.com/n-agetsu/JBatchDemo

Page 97: JSR 352 “Batch Applications for the Java Platform”

GlassFish4 を今すぐダウンロード!ご清聴ありがとうございました。