jBatchとSpringBatchの比較 

# 違い
- jBatchは仕様（JSR-352）、SpringBatchは実装
    - jBatchの実装は3つ存在。RI（GlassFish）、JBeret（WildFly）、SpringBatch。
- 基本的機能は jBatchも、SpringBatchも同じ。
    - SpringBatchの方が高機能。
- もともとSpringBatchが存在して、それを参考にして仕様化したのがjBatch。仕様化した後、SpringBatch3.0にてjBatchへ対応した。

# 機能
jBatchの機能をベースとして記載。**SpringBatchの機能は太字で記載。**

## ジョブ
ジョブはステップの入れ物。ジョブはXMLで記述。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<job id="SimpleBatch"
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     version="1.0">

    <step id="FirstStep" next="SecondStep">
      <chunk item-count="3">
        <reader    ref="SimpleReader" />
        <processor ref="SimpleProcessor" /> 
        <writer    ref="SimpleWriter" />
      </chunk>
    </step>
  
    <step id="SecondStep">
        <batchlet ref="SimpleBatchlet" />
    </step>    
</job>
```

### フロー flow
複数のステップをまとめる要素。

### スプリット split
複数のフローを同時に実行させるもの。

### デシジョン decision
ジョブ内部における次の遷移先をカスタマイズするための機能。
実態はJavaのクラス。 

### 遷移要素 Transition Element
"next" or "end" or "stop" or "fail"
それぞれ次の遷移先を指定させる、正常終了、中断、異常終了。

### リトライ
チャンク型ステップの処理中に特定の例外が発生した場合に、再度そのデータの処理を試みる

### スキップ
チャンク型ステップの処理中に特定の例外が発生した場合に、データを飛ばして次に進む

### ジョブオペレーター
ジョブ自体の開始や停止などの全体的な制御を行う。実態はJavaのインターフェース。jBatchにはジョブオペレータの呼び出し方に関する規定は無いため、自前でジョブオペレータを呼び出すコードが含まれっるクラスを作成し、それをJAX-RSやJSF、EJBとして実行するのが一般的。また、jBatchの仕様には、バッチを決まった時間に起動する方式に関する規定や、それを実現するAPIも含まれていない。アドホックな実行に関する規定も無い。

## ステップ
バッチ内部の個々の処理を実装する部分。実態はJavaのインターフェース。

- チャンク型：複数のデータを逐次的に処理するために使われる
3構成。ItemReader：データの読み込み、ItemProcessor：データの加工、ItemWriter：データの書き込み。
データをある程度のかたまりに分割し定期的に書き込み処理をするようにしている。（「かたまり」=「チャンク」）
**SpringBatchはジェネリクスが使える。jBatchはインターフェースなので入出力の標準実装が提供されていないが、SpringBatchはファイル、DB、JMS入出力の実装が提供されている。**

- バッチレット型：単体で完結する処理に使われる。
ディレクトリ作成やファイルの圧縮、送受信処理などのデータに依存しない処理やコマンド実行の処理で使われる。

- ステップパーティション：ステップ内部を並列実行する機能。

## 補助機能
### リスナ
バッチ処理の進行に応じた特定のタイミング（ジョブやステップの開始や終了、リトライやスキップなどの発生時）で任意の処理を実行することができる機能。

### ジョブリポジトリ
実行中のジョブ情報や、実行終了のジョブに関する情報が保存される。
jBatchのAPIにはジョブリポジトリそのものを実現するようなクラスやインターフェースは用意されていない。

### コンテキスト
ジョブコンテキストとステップコンテキストの2種類。それぞれジョブやステップに関する情報を提供。

### メトリック
チャンク型のステップに対して、実行時の統計情報を提供。
読み取りレコード数、書き込みレコード数、スキップが発生した回数など。

**SpringBatchはライブラリが豊富。csv/tsv,
 xml, jdbcページング。同一形式の複数ファイル読み込み、複数行を1アイテムにマッピング。**

**SpringBatchは「複数サーバを使った」分散処理が可能。**

# 並列処理 (Spring)
Springでは次の4つの方式で並列処理を実現。

- Multi-threaded Step （シングルプロセス）
- Parallel Steps（シングルプロセス）
- Remote Chunking of Step （マルチプロセス）
- Partitioning a Step（シングルorマルチプロセス）

https://docs.spring.io/spring-batch/trunk/reference/html/scalability.html

## Multi-threaded Step
「partition方式」とも呼ばれる。特定の1つのstepをマルチスレッドで実行する。大量データを分割して並列する場合に適した方式。

## Parallel Steps
「split方式」とも呼ばれる。マルチスレッドで実行するが、各スレッドで異なるstepを指定したり、スレッドごとにstepの数を変えたりすることが可能。ある処理の裏で独立した別の処理を実行したい場合に適した方式。

## Remote Chunking of Step 
Spring Remote（RMI、SOAPなどのリモートサービスを実現する機能を提供）と組み合わせることで実現。

##  Partitioning a Step
SPI（ステップ実行を分割してリモートで実行するため機能。SpringBatchで提供）を使って実現。

# 並列処理 (jBatch)

- Partitioned
- Concurrent

## Partitioned
マルチスレッドで実行。各スレッドは同じステップまたはフローを実行する。論理的には複数のインスタンスで同じステップを実行するのと等しい。
→SpringBatchのMulti-threaded Stepと同じ？

## Concurrent
マルチスレッドで実行。スレッドごとに1つのフローを定義して、それらをマルチスレッドで実行。
→SpringBatchのParallel Stepsと同じ？

# 出典

- [JavaEE7 徹底入門](http://www.shoeisha.co.jp/book/detail/9784798140926)
- [Spring 徹底入門](http://www.shoeisha.co.jp/book/detail/9784798142470)
- [Jbatch実践入門 #jdt2015](https://www.slideshare.net/agetsuma/jbatch-jdt2015)
- [jBatch(Java EE 7)をNetBeans+GlassFish+Mavenではじめました](http://masatoshitada.hatenadiary.jp/entry/2015/06/09/130936)
- [待望のバッチ処理機能がJava EE 7で標準化。「jBatch」で何ができるのか、どう使うのか？](https://builder.japan.zdnet.com/sp_oracle/35038499/2/)
- [Scaling and Parallel Processing](
https://docs.spring.io/spring-batch/trunk/reference/html/scalability.html)
- [jBatchのSplit／FlowでStepを並列実行する](http://d.hatena.ne.jp/Kazuhira/20160315/1458049253)
- [JSR-000352 Batch Applications for the JavaTM Platform 1.0, Revision A Maintenance Release for Evaluation
](http://download.oracle.com/otndocs/jcp/batch-1_0_revA-mrel-eval-spec/index.html)