待望のバッチ処理機能がJava EE 7で標準化。「jBatch」で何ができるのか、どう使うのか?

Oracle Java & Developers編集部
2013-10-17 12:30:00
  • このエントリーをはてなブックマークに追加

Java EE 7では、企業システムで多用されているバッチ処理機能が「jBatch」として標準化された。GlassFish 4で実際に試すこともできる。jBatchの特徴、使いこなしのポイントを紹介する。

ユーザー企業も加わって標準化されたjBatch


NTTコムウェア品質生産性技術本部 技術SE部OSS・AP技術担当の上妻宜人氏

 Java EE 7の目玉の1つは、企業システムで多用されているバッチ処理に関して、Javaによる実装方法が「JSR 352: Batch Applications for the Java Platform(通称:jBatch)」として標準化されたことだ。日本オラクルが2013年8月に開催した「リリース記念:今から始めるJava EE 7解説セミナー」では、NTTコムウェア品質生産性技術本部 技術SE部OSS・AP技術担当の上妻宜人氏によるセッション「Java EE 7から加わるバッチ仕様 Batch Applications for the Java Platform」において、jBatchの特徴や主な機能が解説された。同セッションの内容を基に、jBatchがどのような仕様で、これによって何ができるのかを紹介しよう。

 jBatchそのものの解説に先立ち、上妻氏はまず、Java EEでバッチ処理方式が標準化されたことの意義を説明した。

 「バッチ処理」という言葉を聞いて、多くの方は「月次の〆処理」や「銀行勘定系システム」、「在庫管理」、「深夜に動く」、「計算量が膨大」、「ジョブ」、「順序制御」、「並列実行」といったキーワードを連想されるだろう。このことから、「多くの業種やシステムに同様の処理が存在し、求められる機能や用途には共通の点が多い」ことがわかる。この「似通った処理機能が、さまざまな業種で個別に開発/利用されてきた」ことが、Java EEでバッチ処理の標準化が求められていた最大の理由だ。

 jBatchの仕様策定にあたっては、スペック・リードを務めたIBMをはじめ、オラクル、レッドハット、ヴイエムウェアといったITベンダーのほか、金融機関のクレディ・スイスがエキスパート・グループのメンバーとして貢献した。上妻氏は、「クレディ・スイスのようなユーザー企業が、自分たちの求める機能を実現すべく積極的に仕様策定にかかわったという点でも、jBatchはとても興味深い技術」だと話す。

jBatchでは何が決められており、どんなことができるのか

 jBatchでは、主に「バッチに関する用語と各要素間の関連性」、バッチ処理の記述仕様である「ジョブXML」、そして「API」が定義されている。これらが定義されたことにより、「バッチ処理をどのようなアーキテクチャで実現し、そのアーキテクチャをどう実装するか」ということに関するルールが定められたことになる。


※クリックすると拡大画像が見られます

 jBatchで提供される機能には、次のようなものがある。

  • 順序制御
  • チェック・ポイントによるレコード単位でのコミット
  • 壊れたデータが存在する場合でも処理を止めずに継続できるスキップ処理

 「順序制御」は、ジョブXMLによって処理の順序を定義する機能だ。処理ステップを「Flow」としてグループ化したり、条件によって処理方法を分岐(Decision)したり、処理のグループを分割して並列実行(Split)したりといったことが可能である。


※クリックすると拡大画像が見られます

 また「チェック・ポイント」は、決められた数のレコードごとにコミットを行い、万が一、途中で障害などが起きた際には、最後に行われたコミットまでのロールバックやリスタートを容易にする機能だ。デフォルトでは、10レコードごとにコミットされるようになっている。


※クリックすると拡大画像が見られます

 そして「スキップ」は、バッチ処理の途中で壊れたデータが見つかった際、そこで処理を止めずに、壊れたデータだけをスキップして処理を継続する機能である。


※クリックすると拡大画像が見られます

 上妻氏は、今日、一般的に使われているcronやJP1、Tivoliなどの、いわゆる「ジョブ・スケジューラ」とjBatchが持つ機能の違いを、次のように説明する。


※クリックすると拡大画像が見られます

 一般的なジョブ・スケジューラは、jBatchと一部機能が重複する「ジョブ実行順序管理」機能のほかに、指定された時刻や周期でジョブを起動する「スケジューリング機能」、「実行権限の管理機能」を提供している。それに対してjBatchは、あくまでもバッチ・システムを作るための「APIの提供」に主眼を置いており、スケジューリング機能などは提供しない。


※クリックすると拡大画像が見られます

 「既存のジョブ・スケジューラと重複する『ジョブ実行順序管理』機能については、システムの構成など状況に応じて使い分けることになります。jBatchの役割は、他のJava EE仕様と同様に『APIを提供すること』です。これがアプリケーション・サーバの実装としてサポートされるようになることで、例えばJAX-RSを通じてJava EEアプリケーションから簡単にバッチ処理を起動できるようになるといったことが、jBatchが標準化されたことの大きな意義/メリットになります」(上妻氏)

JCLやCOBOLの開発者にもなじみやすいjBatchのアーキテクチャ

 jBatchのアーキテクチャは、「現在、メインフレームなどで実行されているバッチ処理のJava EEへの移行を視野に入れた構成であり、JCLやCOBOLの開発者にもわかりやすいものになっている」と上妻氏は説明する。


※クリックすると拡大画像が見られます

 ジョブは1つ以上のステップ(Step)から構成されており、ステップ全体にかかわる設定はジョブに対して行う。また、処理が止まった際のリスタートが可能か否かといったプロパティがジョブXMLのトップ・レベル要素に記述される。

 次に示すのは、ジョブXMLのトップ・レベル要素の例である。

【ジョブ XMLのトップ・レベル要素の例】


<job id="samplejob">
    <step id="step1" next="step2" />
    <step id="step2" />
    <properties>
        <property name="filePath" value="input.txt">
    </properties>
</job>

 トップ・レベル要素において、一意的な識別子として設定されるジョブID(要素jobの属性id)は必須属性だ(上記コードの黄色いマーキング部分)。次の要素stepでは、ステップの流れを定義する。ここには1つ以上のステップを定義しなければならない(同じく緑のマーキング部分。この例では2つのステップを定義している)。要素propertiesはオプションであり、ここにジョブ全体に対するプロパティを設定する(紫のマーキング部分)。

 jBatchの処理では、スケジュールごとにJobInstanceオブジェクトが生成され、また1つのジョブ実行ごとにJobExecutionオブジェクトが生成される。このとき、JobInstanceオブジェクトについては、再実行に備えて同時に永続化(シリアライズ)が行われ、JobRepositoryオブジェクトに格納される。

 JobInstanceオブジェクトが永続化される理由だが、例えば、ある特定の日に実行されたジョブが失敗した場合でも、JobInstanceオブジェクトが永続化されていれば、それを後日、再実行すれば、当時のデータにアクセスしてバッチ処理を再び実行できる。対象データが異なる場合には、過去のジョブを再実行しつつ、当日分のジョブも並列処理させるといったことが可能になる。


※クリックすると拡大画像が見られます