11. バッチアプリケーションの開発

11.1. 開発チュートリアル

11.1.1. ジョブ定義XMLファイル・バッチアーティファクトのジェネレート

ジョブ定義XMLファイル・バッチアーティファクトのジェネレートについて記載する。

11.1.2. GUIでのジョブXML定義の開発

GUIでのジョブXML定義の開発について記載する。

11.2. プログラミング・開発ガイド

11.2.1. バッチアプリケーションとは

バッチアプリケーションは以下によって構成されます。

バッチアプリケーションは標準的なJARファイルにパッケージ化したり、ターゲットの実行環境でサポートされている 任意のJavaアーカイブタイプに含めることが可能です。例えば、WARや EJB-JARなどに含めることができます。

ただし、WebOTXのバッチサービスで提供するコマンド、および統合運用管理ツール/運用管理コンソールの操作によるジョブの制御は、 Webアプリケーション(WAR)あるいはWebアプリケーションを含むJava EEアプリケーション(EAR)として作成された バッチアプリケーションのみを対象とします。
コマンド、および統合運用管理ツール/運用管理コンソールの操作によるジョブの制御を行う場合、 バッチアプリケーションに含まれるweb.xmlに次の定義を行う必要があります。

	<servlet>
		<servlet-name>jBatch Servlet</servlet-name>
		<servlet-class>com.nec.webotx.batch.ServletContainer</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>jBatch Servlet</servlet-name>
		<url-pattern>/jbatch/*</url-pattern>
	</servlet-mapping>

ジョブを実行可能にするためには、Job定義ファイルをMETA-INF/batch-jobsディレクトリ配下 (warファイルの場合は、WEB-INF/classes/META-INF/batch-jobsディレクトリ配下)に格納して、 アプリケーションと共にパッケージ化しておく必要があります。 その状態で、コマンド、および統合運用管理ツール/運用管理コンソールの操作、あるいは、アプリケーション内の任意のコードからjavax.batch.operations.JobOperatorクラスのstartメソッドを、ジョブ定義ファイルのXMLファイル名とジョブ起動時に渡すパラメータを指定して実行することで、ジョブを起動することができます。

以下は、ジョブ定義ファイルがsample-job.xmlというファイル名でパッケージングされている場合のジョブの起動例です。

JobOperator job = BatchRuntime.getJobOperator();

Properties prop = new Properties();
prop.setProperty("input", "input.txt");

job.start("sample-job", prop);
11.2.1.1. ジョブ

jBatch により定義するジョブは、複数のステップをもち、ジョブの定義中に記載されたフローに基づいて順次 ステップを実行します。

例えば、下記のように3つのステップをもつジョブ1において、ステップ2が成功した場合はジョブ1を終了するが、ステップ2が失敗した場合はステップ3を実行してからジョブ1を終了するような定義を行うことが可能です。

ジョブ内のステップフロー
図11.2.1-1

ジョブ設計の際にはジョブをどのようなステップに分解し、どのようなフローで実行するのかを決定します。

11.2.1.2. ステップ

jBatchでは、実行することが可能なジョブステップとして下記2種類のステップを提供しています。

ジョブステップ設計においては、初めにどの種類のステップとして定義するのかを決定します。

以下にそれぞれの種類についての概要を説明します。

レコード処理ステップ (chunk型ステップ)

レコード処理ステップはデータベースやファイルといったリソース に対して順次レコードの読み書きを行うステップです。

ItemReader、ItemProcessor、ItemWriterというJavaインタフェースを介して処理を実行します。

レコード処理ステップ
図11.2.1-2

ItemReaderと呼ばれるレコード読込部品が順次指定されたリソースからデータを読み出し、全てのレコードを読み出すまで処理を繰り返します。

この繰り返し処理は下記図のとおり、あらかじめ指定したサイズのチャンク毎にレコードの読込や、トランザクションのコミット、または、ファイルリソースへの書き出しを行います。

レコード処理シーケンスとトランザクション
図11.2.1-3

読込んだレコードはJavaのオブジェクトに変換する必要があります 。作成するジョブステップの要件やレコードデータに応じたJavaのコーディングを行います。

変換されたオブジェクトはItemProcessorによって適切なデータに加工し、ItemWriterによって加工済みデータを出力リソースに書き込みます。

各処理中に例外が発生した場合にその処理をリトライ、または、スキップするかどうかを設定することができます。これら設定を行わない場合、例外が発生したステップは失敗したものと判断されます。

Javaメソッド実行ステップ (batchlet型ステップ)

Javaメソッド実行ステップは、指定したJavaのメソッドを一度だけ呼び出すステップです。

レコード処理ステップのような繰り返し処理は行いません。

呼び出したJavaのメソッドで例外が発生すると、リトライやスキップ等の処理は行われず、そのステップが失敗したものと判断します。

また、このステップはトランザクションを実行しないため、必要に応じて指定したメソッド内部で独自にトランザクションを開始させる必要があります。

例えば、ストアド・プロシージャの呼び出し等を行うためのステップとして利用することが可能です。

11.2.2. ジョブの定義方法

11.2.2.1. 概要

jBatchジョブの定義方法について説明します。

ジョブをWebOTX上で動作させるためには、jBatchで定義されているジョブ定義言語の記法に従ってジョブとステップを定義する必要があります。
下記のように、Java EE が提供するxml schemaを指定し、各ジョブの名前と、そのジョブが実行するステップを定義します。
ステップの定義方法については後述します。

<job id="job1" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
    ... ジョブの定義 ...
</job>

以下のように定義すると、"job1"では"step1"を実行し、そのステップが正常に終了すると"step2"を実行します。さらに"step2"が正常に終了するとジョブが正常終了します。

<job id="job1" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
    <step id="step1" next="step2"/>
    <step id="step2"/>
</job>

以下のように定義することで、ステップの実行結果によってステップのフローを分岐させることができます。
"step1"が失敗した場合に"recover"を実行し、それ以外の場合は"step2"に進みます。また"recover"が正常に終了すると"step2"を実行します。

<job id="job2" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
    <step id="step1"/>
        <next on="FAILED" to="recover"/>
        <next on="*" to="step2"/>
    </step>
    <step id="recover" next="step2"/>
    <step id="step2"/>
</job>
11.2.2.2. プロパティ値の定義

ジョブには、以下のようにjob要素の子要素であるproperties要素で任意のプロパティを定義できます。

<job id="job1" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
  <properties>
    <property name="{property-name}" value="{property-value}"/>
  </properties>
    ... ジョブの定義 ...
</job>

また、property要素で定義するプロパティのうち、name属性の値が以下であるプロパティは、ジョブリポジトリに格納されてジョブ実行履歴画面で参照することができます。

表11.2.2.2.1
項目名 name属性の値 説明
分類タグ com.nec.webotx.jbatch.tag ジョブを分類するためのタグです。
128文字以内で指定してください。マルチバイト文字も指定可能です。半角スペース区切りで複数の値を入力することができます。
ジョブ実行履歴画面の「ジョブ」画面の「分類タグ」列に表示されます。
ジョブコメント com.nec.webotx.jbatch.comment ジョブに付与するコメントです。
128文字以内で指定してください。マルチバイト文字も指定可能です。
ジョブ実行履歴画面の「ジョブ」画面の「コメント」列に表示されます。

以下に設定例を示します。

<job id="job1" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
  <properties>
    <property name="com.nec.webotx.jbatch.tag" value="tag1"/>               //分類タグとしてtag1を指定。
    <property name="com.nec.webotx.jbatch.comment" value="jobcomment1"/>    //ジョブのコメントとしてjobcomment1を指定。
  </properties>
    ... ジョブの定義 ...
</job>
11.2.2.3. WebOTX Developerを利用したジョブの定義方法

WebOTX Developerではジョブの定義するために次のGUIツールを提供します。

表11.2.2.3.1
提供ツール 説明
Batch Job XML Fileウィザード ジョブ定義XMLファイルを作成するウィザードです。
ジョブ定義XMLファイルエディタ ジョブ定義の構成を視覚的に編集するGUIツールです。
Batch Job Configration Editor ジョブ定義XMLファイル内の各種プロパティを参照及び編集するGUIツールです。
Batch Job Artifactウィザード ジョブの処理を実装する、Javaクラスファイルを作成するウィザードです。

ジョブ定義XMLファイルは、ジョブ定義XMLファイル生成用ウィザードを使用して作成します。
ジョブアプリのプロジェクの右クリックトメニューから 新規 > その他 を選択、ウィザード選択ダイアログが表示されます。


図11.2.2.3-1

ウィザード選択ダイアログから Batch > Batch Job XML File を選択し 次へ をクリック、New Batch Job XMLダイアログが表示されます。


図11.2.2.3-2


表11.2.2.3.2
項目 説明
親フォルダ ジョブ定義XMLファイルを作成するフォルダを設定します。
ファイル名 ジョブ定義XMLの名前を設定します。
Job id ジョブを識別する名前を設定します。

入力後に 終了 をクリック、ジョブ定義XMLファイルが作成されます。

<?xml version="1.0" encoding="UTF-8"?>
<job id="job1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
    version="1.0">
</job>

作成したジョブ定義XMLファイルは、ジョブ定義XMLファイルエディタを使用して編集を行います。
Flow Elements の Stepアイコン をクリックしたまま、エディタにドラッグしてStepを追加します。


図11.2.2.3-3

Flow Elements から追加したStepをダブルクリックするとStepのIDを直接入力できます。


図11.2.2.3-4

<?xml version="1.0" encoding="UTF-8"?>
<job id="job1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
    version="1.0">
    <step id="step1"></step>
    <step id="step2"></step>
</job>

Stepの実行順序の設定は Transition  の  Nextアイコン を使用します。先に実行するStepをクリックし次に実行するStepをクリック、これで実行順序が設定できます。


図11.2.2.3-5

<?xml version="1.0" encoding="UTF-8"?>
<job id="job1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
    version="1.0">
    <step id="step1" next="step2">
    </step>
    <step id="step2"></step>
</job>

ステップの実行結果によってステップのフローを分岐させるには Transition の Next Onを使用します。
この例では"step1"が失敗した場合に"recover"を実行し、それ以外の場合、"step2"に進みます。また"recover"が正常に終了すると"step2"を実行します。
Transition から Next Onアイコン をクリック、先に実行するStepをクリックし次に実行するStepをクリックします。


図11.2.2.3-6

<?xml version="1.0" encoding="UTF-8"?>
<job id="job1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
    version="1.0">
    <step id="step1">
        <next to="recover" on="FAILED"/>
        <next to="step2" on="*"/>
    </step>
    <step id="step2"></step>
    <step id="recover"></step>
</job>

プロパティの定義は、 Batch Job Configration Editor で設定します。


図11.2.2.3-7

<?xml version="1.0" encoding="UTF-8"?>
<job id="job1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
    version="1.0">
    <properties>
        <property name="com.nec.webotx.jbatch.tag" value="tag1"/>
        <property name="com.nec.webotx.jbatch.comment" value="jobcomment1"/>
    </properties>
    <step id="step1">
 ... ステップの定義 ...
</job>

11.2.3. ステップの定義方法

ステップの定義では、ステップの種類とそのステップに対する設定を行います。

jBatchでは、下記の中からステップの種類を定義することができます。

  1. レコード処理ステップ (chunk型ステップ)
  2. javaのメソッドを実行するステップ (batchlet型ステップ)

以下に各種類に応じた基本的なステップの定義方法について説明します。

11.2.3.1. レコード処理ステップ (chunk型ステップ) の定義方法

jBatchが提供する部品を利用してレコード処理ステップを定義する方法について説明します。

レコード処理ステップでは、基本的に以下のような流れで処理が実行されます。

  1. ItemReaderによって、リソースから1レコードを読込み1つのItem(Javaオブジェクト)を生成する
  2. item-countで指定されたサイズ分1. の処理によってItemを読込む(以降このデータをチャンクデータと呼ぶことにします)
  3. チャンクデータを一件ずつItemProcessorによって処理し、場合によっては加工したデータへと更新します
  4. 加工されたチャンクデータをItemWriterによってリソースへ書込みを行う
  5. ItemReaderによって読込むリソースがなくなるまで1. から 4. の処理を繰り返す
ステップの定義

最も基本的なレコード処理ステップは、下記のように<step>、<chunk>によって指定します。<chunk>の属性として reader、processor、writer の名前を指定します。 item-count 属性によってチャンクサイズを指定します。

<step id="step1">
    <chunk item-count="10">
        <reader ref="ItemReader"/>
        <processor ref="ItemProcessor"/>
        <writer ref="ItemWriter">
    </chunk>
</step>

ItemReader、ItemProcessor、ItemWriter の定義方法については、以下で詳細に説明します 。

ItemReaderの定義方法

 javax.batch.api.chunk.ItemReader を実装することによって、 リソースからの読み込みを行う reader を定義することができます。

package webotx.batch.sample;

import java.io.Serializable;
import javax.batch.api.chunk.ItemReader;
import javax.inject.Inject;
import javax.inject.Named;

@Dependent
@Named("SampleItemReader")
public class SampleItemReader implements ItemReader {
    private BufferedReader br;
    private int readCount = 0;

    public void open(Serializable checkpoint) throws Exception {
        br = new BufferedReader(new FileReader(C:\tmp\input.txt));

        int startLine = (checkpoint == null)? 0 : (int)checkpoint;
        int currentLine = 0;
        while(startLine > currentLine) {
            br.readLine();
    	    currentLine++;
        }
    }

    public void close() throws Exception {
        br.close();
    }

    public Object readItem() throws Exception {
        String line = br.readLine();
        return line;
    }

    public Serializable checkpointInfo() throws Exception {
        return readCount;
    }

}

次のように上記クラスをステップの定義ファイルで設定します。

<reader ref="SampleItemReader"/>
ItemProcessorの定義方法

 javax.batch.api.chunk.ItemProcessor を実装することによって、 読込んだデータを加工するための processor を定義することができます。

package webotx.batch.sample;

import javax.batch.api.chunk.ItemProcessor;
import javax.enterprise.context.Dependent;
import javax.inject.Named;

@Dependent
@Named("SampleItemProcessor")
public class SampleItemProcessor implements ItemProcessor {

    public Object processItem(Object item) throws Exception {
        String line = (String) item;
        OutputItem out = new OutputItem();
        out.setValue(line.toUpperCase());
        return out;
    }
}

次のように上記クラスをステップの定義ファイルで設定します。

<processor ref="SampleItemProcessor"/>
ItemWriterの定義方法

 javax.batch.api.chunk.ItemWriter を実装することによって、 加工したデータを書き込むための writer を定義することができます。

package webotx.batch.sample;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.Serializable;
import java.util.List;

import javax.batch.api.chunk.ItemWriter;
import javax.inject.Inject;
import javax.inject.Named;

@Dependent
@Named("SampleItemWriter")
public class SampleItemWriter implements ItemWriter {
    private BufferedWriter bw;

    public void open(Serializable checkpoint) throws Exception {
        bw = new BufferedWriter(new FileWriter("C:\tmp\output.txt"));
    }

    public void writeItems(List<Object> items) throws Exception {
        for (Object i : items) {
            String line = (String) i;
            bw.write(line);
            bw.newLine();
        }
    }

    public Serializable checkpointInfo() throws Exception {
    	return null;
    }

    public void close() throws Exception {
        bw.close();
    }

}

次のように上記クラスをステップの定義ファイルで設定します。

<writer ref="SampleItemWriter"/>
リトライ・スキップの設定

レコード処理ステップの実行中に例外が発生した場合に、処理をリトライ、または、スキップするための設定を行うことができます。

<chunk>の属性にskip-limit、retry-limit によってリトライ・スキップの許容回数を指定し、<chunk>の子要素として<skippable-exception-classes>や<retryable-exception-classes>を追加することで指定された例外が発生した場合にリトライ・スキップの処理を行います。

<step id="step1">
    <chunk item-count="10">
        <reader ref="itemReader"/>
        <processor ref="itemProcessor"/>
        <writer ref="itemWriter">
        <skippable-exception-classes>
            <include class="user.logic.SkippableException"/>
        </skippable-exception-classes>
        <retryable-exception-classes>
            <include class="user.logic.RetryableException"/>
        </retryable-exception-classes>
    </chunk>
</step>
11.2.3.2. Javaメソッド実行ステップ (batchlet型ステップ) の定義

Javaメソッドを呼び出すだけのステップを定義する場合、 javax.batch.api.Batchlet を実装したクラスを作成し 以下のようにステップの定義ファイルで設定します。

<step id="step1">
    <batchlet ref="SampleBatchlet"/>
</step>

以下は、 javax.batch.api.Batchlet の実装例です。なお、ジョブを停止すると、stopメソッドが呼ばれますが Batchletの処理を適切に停止するためには、それを可能とする実装をstopメソッド内で行っておく必要があります。

package webotx.batch.sample;

import javax.batch.api.Batchlet;

@Dependent
@Named("SampleBatchlet")
public class SampleBatchlet implements Batchlet {

    public String process() throws Exception {
        hoge();
        return "SUCCESS";
    }

    public void stop() throws Exception {
        //process()を停止する処理を実装する
    }

}
11.2.3.3. プロパティ値の定義

ジョブ同様、ステップには以下のようにstep要素の子要素であるproperties要素で任意のプロパティを定義できます。

<step id="step1">
  <properties>
    <property name="{property-name}" value="{property-value}"/>
  </properties>
    ... ステップの定義 ...
</step>

また、property要素で定義するプロパティのうち、name属性の値が以下であるプロパティは、ジョブリポジトリに格納されてジョブ実行履歴画面で参照することができます。

表11.2.3.3.1
項目名 name属性の値 説明
ステップコメント com.nec.webotx.jbatch.comment ステップに付与するコメントです。
128文字以内で指定してください。マルチバイト文字も指定可能です。
ジョブ実行履歴画面の「ステップ」画面の「コメント」列に表示されます。

以下に設定例を示します。

<step id="step1">
  <properties>
    <property name="com.nec.webotx.jbatch.comment" value="stepcomment1"/>    //ステップのコメントとしてstepcomment1を指定。
  </properties>
    ... ステップの定義 ...
</step>
11.2.3.4. WebOTX Developerを利用したステップの定義方法

ステップの種類を定義するにはStepの右クリックメニューから Add から選択します。
レコード処理ステップを追加するときは Chunk を選択してください。


図11.2.3.4-1

定義したChunkの詳細な設定は Batch Job Configration Editorで設定します。
ReaderとWriterの定義はChunk定義を追加した時点で最初から定義されています。


図11.2.3.4-2

このChunk定義にProcessorを追加する場合、Chunk定義の右クリックメニューから Add > Processor を選択します。


図11.2.3.4-3

ReaderとWriterおよびProcesserの設定で、Jbatchのインタフェースを実装したクラス名を定義します。


図11.2.3.4-4

新規にクラスを作成する場合は、 Batch Artifact ウィザードを使用してクラスのひな形を作成できます。
ジョブアプリのプロジェクを選択し、右クリックメニューから 新規 > その他 を選択、ウィザード選択ダイアログが表示されます。


図11.2.2.4-5

ウィザード選択ダイアログから Batch > Batch Artifact を選択し 次へ をクリック、New Batch Artiactダイアログが表示されます。


図11.2.2.4-6


表11.2.2.3.2
項目 説明
ソース・フォルダ プロジェクト情報から、ソースフォルダが設定されます。
パッケージ "com.nec.webotx.jbatch" パッケージが設定されます。
名前 実装するクラス名を設定します。
Artifact Jbatchが提供するArtifactを選択します。
Artifact loader デフォルトの "@Named"を選択してください。
Artifact name 名前項目で入力した名前が設定されます。先頭の文字は小文字になります。

入力後に 終了 をクリック、クラスファイルのひな形が作成されます。

package com.nec.webotx.jbatch;

import javax.batch.api.BatchProperty;
import javax.batch.api.chunk.AbstractItemReader;
import javax.inject.Inject;
import javax.inject.Named;

@Named
public class SampleItemReader extends AbstractItemReader {

}

ステップの実装の詳細はステップの定義方法を参照してください。

以下では、ウィザードで作成できるクラスを示します。

表11.2.2.3.3
Artifact Implement interfaceを選択した場合に
実装するインタフェース
Extend abstract classを選択した場合に
継承する抽象クラス
Batchlet Batchlet AbstractBatchlet
Decider Decider -
Item Reader ItemReader AbstractItemReader
Item Writer ItemWriter AbstractItemWriter
Item Processor ItemProcessor -
Checkpoint Algorithm CheckpointAlgorithm AbstractCheckpointAlgorithm
Partition Mapper Partition Mapper -
Partition Reducer PartitionReducer AbstractPartitionReducer
Partition Collector PartitionCollector -
Partition Analyzer PartitionAnalyzer AbstractPartitionAnalyzer
Job Listener JobListener AbstractJobListener
Step Listener StepListener AbstractStepListener
Chunk Listener ChunkListener AbstractChunkListener
Item Read Listener ItemReadListener AbstractItemReadListener
Item Process Listener ItemProcessListener AbstractItemProcessListener
Item Write Listener ItemWriteListener AbstractItemWriteListener
Skip Read Listener SkipReadListener -
Skip Process Listener SkipProcessListener -
Skip Write Listener SkipWriteListener -
Retry Read Listener RetryReadListener -
Retry Process Listener RetryProcessListener -
Retry Write Listener RetryWriteListener -

Memo

11.2.4. パラメータの指定方法

下記のような定義を行うことで、ジョブの起動時に指定したジョブパラメータをステップの定義で利用することができます。

<job id="job1" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
    <properties>
        <property name="resource" value="#{jobParameters['input.file.name']}" />
    <properties>
    ・・・
</job>

また、ステップ-ステップ間で情報の受け渡しを行いたい場合、ジョブ内の共有領域である JobContext を利用することが可能です。 標準@Injectアノテーション(javax.inject.Inject)を使用したインジェクションによってバッチコンテキストにアクセスします。
また、ジョブ定義でジョブのpropertyとして定義した値を、以下のように取得することができます。

public class SampleBatchlet implements Batchlet {

    @Inject JobContext _jctxt;

    public String process() throws Exception {
        String value = (String)_jctxt.getProperties().get("key");
    }

}

上記同様に、ステップ内で情報を共有したい場合、ステップ内の共有領域である StepContext を利用することが可能です。

public class SampleBatchlet implements Batchlet {

    @Inject StepContext _sctxt;

    public String process() throws Exception {
        String value = (String)_sctxt.getProperties().get("key");
    }

}

11.2.5. ジョブ実行のハンドリング

各ジョブの定義にリスナを登録することで、ジョブの開始・終了時や、レコード処理の開始・終了時に独自の処理を埋め込むことができます。

ジョブの定義に下記の設定を行うことでリスナを登録します。ここで登録するリスナは javax.batch.api.listener.JobListener インタフェースを実装し、ジョブの実行前と実行後に独自の処理をコーディングします。

<job id="job1" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
    ... ジョブの定義 ...
    <listeners>
        <listener ref="SampleListener"/>
    </listeners>
</job>

この他に、利用可能なリスナの種類として下記インタフェースが提供されています。

表11.1.5.1
リスナ 説明
JobListener ジョブ処理の開始・終了をハンドリングします。
StepListener ステップ処理の開始・終了をハンドリングします。
ChunkListener チャンク処理の開始・終了をハンドリングします。
ItemReadListener 1件のレコード読込の開始・終了・エラーをハンドリングします。
ItemProcessListener 1件のレコード加工の開始・終了・エラーをハンドリングします。
ItemWriteListener チャンクデータ書込みの開始・終了・エラーをハンドリングします。
SkipListener ItemReader,ItemProcessor,ItemWriterの処理中に発生したスキップ可能例外をハンドリングします。
RetryListener ItemReader,ItemProcessor,ItemWriterの処理中に発生したリトライ可能例外をハンドリングします。

11.2.6. ジョブの実行制御

ジョブに対しては、実行、停止、再実行という操作が可能です。ジョブ操作の詳細は [ 構築・運用 > ドメインの拡張機能 > 9. バッチサービス > 9.4. ジョブの実行制御 ] を参照してください。

11.3. サンプル

11.3.1. バッチアプリケーション

11.3.1.1. 概要

バッチアプリケーションのサンプルです。以下の2つのジョブを含むバッチアプリケーションです。

このサンプルではバッチアプリケーションをWebアプリケーションとして作成しています。 Webアプリケーション作成についての詳細は、[ アプリケーション開発 > Webアプリケーション > 2.1. Webアプリケーションの作成 ] で説明しています。

11.3.1.2. 構成
パス 説明
src Webプロジェクトのソースフォルダです。
WebContent コンテキストディレクトリです。
WebContent/WEB-INF/classes/META-INF/batch-jobs ジョブ定義ファイルを格納するディレクトリです。
WebContent/WEB-INF/classes/META-INF/batch-jobs/file2db.xml file2dbジョブについてのジョブ定義ファイルです。
WebContent/WEB-INF/classes/META-INF/batch-jobs/db2file.xml db2fileジョブについてのジョブ定義ファイルです。
WebContent/WEB-INF/classes/META-INF/persistence.xml PRODUCT_INFOテーブルへのデータ入出力に使用するJPAの設定ファイルです。
<jta-data-source>要素にPRODUCT_INFOテーブルを作成するデータソースのJNDI名を指定してください。 ジョブリポジトリとして使用するデータソースと同じでも問題ありません。
jobparameter.properties ジョブ実行時に指定するジョブパラメータファイルです。本サンプルでは、ジョブで行うファイル入出力のパスを指定します。
  • input_file:file2dbジョブで読み込みを行うファイルの絶対パスを指定します。サンプルに同梱するinput.csvを置くパスを指定します。
  • output_file:db2fileジョブで書き込みを行うファイルの絶対パスを指定します。
sample.sql ジョブで使用するPRODUCT_INFOテーブルを作成するためのSQLファイルです。
input.csv file2dbジョブで入力データとして使用するCSVファイルです。

11.3.1.3. 実行手順

ここでは、file2dbジョブを実行する場合の手順を説明します。

1.  バッチサービスを利用するために必要な設定を行います。詳細は [ 構築・運用 > ドメインの拡張機能 > 9. バッチサービス ] を参照してください。

2.  サンプルアプリケーションで使用するPRODUCT_INFOテーブルを準備します。サンプルアプリケーションに含まれるsample.sqlを実行してください。 このSQLファイルは、サンプルアプリケーションで使用するPRODUCT_INFOテーブルを作成し、サンプルデータを挿入します。 なお、サンプルアプリケーションでのread/write対象データソースはWebContent/WEB-INF/classes/META-INF/persistence.xmlに指定します。sample.sqlの実行は、persistence.xmlで指定したデータベースに対して行ってください。

この時、PRODUCT_INFOテーブルのデータを確認しておきます。

SQL> SELECT * FROM PRODUCT_INFO ORDER BY ID;
        ID NAME                                PRICE
---------- ------------------------------ ----------
         1 pencil                                100
         2 pen                                   100
         3 eraser                                 50
         4 copy paper                            300
         5 stapler                               150

3.  サンプルプロジェクトjBatchSample.zipをインポートします。

4.  次のライブラリをアプリケーションのクラスパスに追加します。

jarファイル 備考
%WebOTX_HOME%\modules\javax.inject.jar CDI関連、コンパイル/実行時

5.  WARファイルを作成します。右クリック > エクスポート > Web > WARファイル を選択して作成します。

6.  作成したWARファイルをWebOTX Application Serverのドメインに配備します。また、ジョブ実行時に指定するjobparameter.propertiesと、 file2dbジョブの入力ファイルとなるinput.csvを、ドメインが存在するサーバにコピーします。jobparameter.propertiesには、次のように定義しておきます。

input_file=<コピーしたinput.csvの絶対パス> (file2dbジョブの入力として使用します)
output_file=<db2fileジョブの出力先となるファイルの絶対パス> (file2dbジョブでは使用しません。db2fileジョブの出力として使用します)

7.  統合運用管理ツールあるいは、運用管理コンソールでドメインに接続し、ツリービューより「<ドメイン名>」-「アプリケーションサーバ」-「バッチサービス」-「バッチジョブ」-「jBatchSample:file2db」を選択し、 右クリックメニューから「ジョブ起動」を選択します。

8.  起動したウィンドウの「ジョブパラメータ」に、jobparameter.propertiesの絶対パスを指定し、「実行」ボタンを押します。この操作でジョブの実行が開始されます。

9.  結果を確認します。再び、PRODUCT_INFOテーブルのデータを確認します。input.csvを入力として、テーブルにレコードが追加がされていることが確認できます。

SQL> SELECT * FROM PRODUCT_INFO ORDER BY ID;
        ID NAME                                PRICE
---------- ------------------------------ ----------
         1 pencil                                100
         2 pen                                   100
         3 eraser                                 50
         4 paper                                  10
         5 stapler                               150
         6 note                                  100
         7 notepad                               150
         8 calculator                           1000
         9 pencil case                           500
        10 brush                                1000

また、統合運用管理ツールあるいは、運用管理コンソールのジョブ実行履歴画面で、実行を開始したジョブの状況を確認できます。

11.3.1.4. 注意事項

ジョブ定義XMLで、"split"を定義しステップを並行して実行するように設定した場合、並行して実行したステップの実行履歴は
統合運用管理ツール/運用管理コンソールのステップの実行履歴画面に表示されますが、ジョブの実行履歴画面にも表示されます。