単純なトランザクション・バッチ・アプリケーションの開発

バッチ・ジョブ・コントローラーおよび Enterprise JavaBeans (EJB) データ・ストリーム、コマンド行、または Apache ANT ツールを使用して、単純なバッチ・アプリケーションを作成することができます。

このタスクの概要

トラブルの回避: バッチ・ステップで、バッチ・アプリケーションがデプロイされているアプリケーション・サーバーのファイル・システムに対してローカルなデータを持つバッチ・データ・ストリーム (BDS) を使用する場合は、ジョブ再始動シナリオをサポートするために特定のステップに従う必要があります。 このようなバッチ・アプリケーションが複数のアプリケーション・サーバーにデプロイされ、それらのサーバーが複数のマシン上で稼動している可能性がある場合は、そのバッチ・ジョブが最初に実行されたマシンでリスタート要求が受け入れられるという保証はありません。 この問題は、バッチ・アプリケーションがクラスターにデプロイされているときに、このようなアプリケーションに対して実行されているバッチ・ジョブを取り消してから再開すると発生します。 このシナリオでは、別のマシンで実行されているアプリケーション・サーバーに、デプロイメントによってリスタート要求が送信される可能性があります。 したがって、ファイルを基にしたアフィニティーが必要な場合、ジョブの再始動シナリオをサポートする ために以下の解決策を適用できます。
  • バッチ・アプリケーションが開始される可能性があるすべてのマシンでデータを同等に使用できるようにします。 例えば、ネットワーク・ファイル・システムを使用します。 この処置では、アプリケーションのパフォーマンスが低下することがあります。
  • ローカル・データが存在するマシン上でのみ稼動できるアプリケーション・サーバーにアプリケーションをデプロイします。 この処置を実行するには、ノード・グループ内のメンバー・ノードが 1 つのみであるクラスターにアプリケーションをデプロイします。
問題の回避: バッチ・アプリケーション開発者は、バッチ・ステップのコールバック・メソッドで行われたトランザクション作業が、 グリッド・エンドポイントによって開始されたグローバル・トランザクションを確実に継承するようにする必要があります。 この処置により、バッチ・ステップで実行された作業はすべてのチェックポイントでコミットされ、ステップが失敗した場合にのみロールバックされるようになります。

一部のコマンドは印刷目的のために複数行に分割されています。

手順

  • バッチ・ジョブ・コントローラーと EJB データ・ストリームを使用してバッチ・ジョブを作成します。
    1. バッチ・ジョブ・ステップを作成します。
      1. com.ibm.websphere.BatchJobStepInterface インターフェースを実装する Java™ クラスを作成します。
      2. ビジネス・ロジックを実装します。

        ステップに 1 つの入力ストリームと 1 つの出力ストリームがある場合は、代わりに GenericXDBatchStep の汎用バッチ・ステップを使用することもできます。

    2. バッチ・データ・ストリームを作成します。
      1. com.ibm.websphere.batch.BatchDataStream インターフェースを実装する Java クラスを作成します。

        バッチ・データ・ストリームにはビジネス・ロジックからアクセスします。例えば、jobID と stepID で BatchDataStreamMgr を呼び出すことによってバッチ・ジョブ・ステップからアクセスします。 JobID と stepID は、キー BatchConstants.JOB_ID と BatchConstants.STEP_ID を使用して、ステップ Bean プロパティー・リストから取得します。

      2. BatchConstants.JOB_ID を com.ibm.websphere.batch.JobID にマップし、BatchConstants.STEP_ID を com.ibm.websphere.batch.StepID にマップします。

        BatchConstants クラスへのアクセス権限を既に持っている必要があります。

        バッチ・データ・ストリームのフレームワークには、ファイルやデータベースなどのさまざまなタイプのデータ・ストリームを処理するための、すぐに使えるいくつかのパターンが用意されています。 バッチ・データ・ストリームのフレームワークを使用するには、次のステップを実行します。

        1. 操作するデータ・ストリーム・タイプ ( TextFile、 ByteFile、 JDBC、 z/OS® ストリームなど) を指定します。
        2. ストリームから読み取るか、ストリームに書き込むかを指定します。
        3. バッチ・データ・ストリームのフレームワークおよびパターンの表を参照してください。 サポート・クラスの列から、データ・ストリームのタイプおよび操作と一致するクラスを選択します。 例えば、テキスト・ファイルからデータを読み取るには、TextFileReader を選択します。
        4. パターン名の列に記載されている、前述のステップで選択したサポート・クラスに対応するインターフェースを実装します。 サポート・クラスは、ストリームおよびバッチ・プログラミング・モデルに関連する記帳アクティビティーをすべて処理します。 実装クラスでは、ストリーム処理ロジックに焦点が当てられています。
        5. xJCL でサポート・クラスおよび実装クラスを宣言します。
        6. ステップで必要なデータ・ストリームごとに、この手順を繰り返します。
    3. オプション: ジョブ・ステップ・コンテキストを取得します。
      JobStepContext ctx= JobStepContextMgr.getContext();
      JobStepContextMgr サービス・クラスは、バッチ・ジョブ・ステップが JobStepContext オブジェクトへの参照を取得するのを可能にします。 ジョブ・ステップ・コンテキストには、以下の機能があります。
      • 現行バッチ・ジョブ・ステップが実行されるコンテキストを一意的に識別する情報 (ジョブ ID など) へのアクセス
      • バッチ・ジョブ・ステップの存続期間に、バッチ・プログラミング・フレームワーク・メソッドの間で アプリケーション固有情報を渡すことができる一時的なユーザー・データ域。
      • ステップをまたがってアプリケーション固有情報を渡すことができるパーシスタント・ユーザー・データ域。

      PersistentMap ヘルパー・クラスを使用して、ジョブ・ステップ・コンテキストのパーシスタント・ユーザー・データ域での基本的な型 (boolean や double など) の保管を単純化できます。

    4. xJCL でバッチ・データ・ストリームを定義します。
      <batch-data-streams>	 
         <bds> 	
      <logical-name>inputStream</logical-name>  	
      <props>  	    
           <prop name="PATTERN_IMPL_CLASS" value="MyBDSStreamImplementationClass"/>
      <prop name="file.encoding" value="8859_1"/>  
           <prop name="FILENAME" value="${inputDataStream}" />
           <prop name="PROCESS_HEADER" value="true"/>  
           <prop name="AppendJobIdToFileName" value="true"/> </props> 
      <impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.FileByteReader
      </impl-class> 
      </bds>
      PATTERN_IMPL_CLASS クラスは BDS フレームワーク・パターンのユーザー実装を示し、impl-class プロパティーはサポート・クラスを示します。
    5. オプション: スキップ・レベル処理を有効にします。

      トランザクションのバッチ・ジョブでレコードの読み取りエラーおよび書き込みエラーをスキップするには、レコード・スキップ処理を使用します。 レコード・スキップ・ポリシーは、xJCL で指定します。 詳しくは、レコード・スキップ処理に関するトピックをお読みください。

    6. オプション: 再試行ステップ処理を有効にします。

      トランザクション・バッチ・ジョブにおいて processJobStep メソッドでエラーが発生したときは、ステップ再試行処理を使用してジョブ・ステップを再試行します。 ステップ再試行ポリシーは xJCL で指定します。 詳しくは、ステップ再試行処理に関するトピックを参照してください。

    7. オプション: トランザクション・モードを構成します。

      トランザクション・モードを使用して、ジョブ関連の成果物が、 グローバル・トランザクション・モードで呼び出されるか、ローカル・トランザクション・モードで呼び出されるかを定義します。 詳しくは、構成可能なトランザクション・モードに関するトピックをお読みください。

    8. オプション: ジョブ・リスナーを指定します。

      ジョブおよびステップに関して初期設定とクリーンアップを追加する com.ibm.websphere.batch.listener.JobListener インターフェースの実装を提供します。 ジョブ・レベル・リスナー・エレメントを使用して、ジョブ・リスナーを xJCL に指定してください。

      ジョブ・リスナー beforeJob() メソッドは、どのユーザー成果物の呼び出しよりも前に呼び出されます。 ジョブ・リスナー afterJob() メソッドは、最後のユーザー成果物が呼び出された後で呼び出されます。 ジョブ・リスナー beforeStep() メソッドは、ステップ関連のどのユーザー成果物よりも前に呼び出されます。 ジョブ・リスナー afterStep() メソッドは、ステップ関連の最後のユーザー成果物として呼び出されます。 ジョブ・リスナーは、呼び出されるたびに、ジョブ・ログにメッセージを記録します。

    9. バッチ・ジョブ・コントローラーを宣言します。
      1. ステートレス・セッション Bean をデプロイメント記述子に追加し、 製品 が提供する実装クラスを指すようにします。 これは、Bean クラスとして com.ibm.ws.batch.BatchJobControllerBean を指定することによって行います。 この指定は、バッチ・アプリケーション当たり 1 回のみ実行します。
      2. リモート・ホーム・インターフェース・クラスに com.ibm.ws.batch.BatchJobControllerHome を使用し、リモート・インターフェース・クラスに com.ibm.ws.batch.BatchJobController を使用します。
    10. EJB デプロイメント記述子を構成します。
      1. タイプが commonj.work.WorkManager であるデフォルトの WorkManager wm/BatchWorkManager に対するコントローラー Bean のリソース参照を構成します。
      問題の回避: バッチ・アプリケーションの Enterprise JavaBeans (EJB) デプロイメント記述子で、バッチ・コントローラー Bean のデプロイメント記述子を宣言する必要があります。 バッチ・アプリケーション当たり、1 つのコントローラー Bean のみを定義できます。
  • コマンド行を使用してバッチ・ジョブを作成します。
    1. バッチ・ジョブ・ステップを作成します。
      1. com.ibm.websphere.BatchJobStepInterface インターフェースを実装する Java クラスを作成します。
      2. ビジネス・ロジックを実装します。

        ステップに 1 つの入力ストリームと 1 つの出力ストリームがある場合は、代わりに GenericXDBatchStep の汎用バッチ・ステップを使用することもできます。

    2. バッチ・データ・ストリームを作成します。
      1. com.ibm.websphere.batch.BatchDataStream インターフェースを実装する Java クラスを作成します。

        バッチ・データ・ストリームにはビジネス・ロジックからアクセスします。例えば、jobID と stepID で BatchDataStreamMgr を呼び出すことによってバッチ・ジョブ・ステップからアクセスします。 JobID と stepID は、キー BatchConstants.JOB_ID と BatchConstants.STEP_ID を使用して、ステップ Bean プロパティー・リストから取得します。

      2. BatchConstants.JOB_ID を com.ibm.websphere.batch.JobID にマップし、BatchConstants.STEP_ID を com.ibm.websphere.batch.StepID にマップします。

        BatchConstants クラスへのアクセス権限を既に持っている必要があります。

        バッチ・データ・ストリームのフレームワークには、ファイルやデータベースなどのさまざまなタイプのデータ・ストリームを処理するための、すぐに使えるいくつかのパターンが用意されています。 バッチ・データ・ストリームのフレームワークを使用するには、次のステップを実行します。

        1. TextFile、ByteFile、JDBC、z/OS のストリームなど、操作するデータ・ストリームのタイプを指定します。
        2. ストリームから読み取るか、ストリームに書き込むかを指定します。
        3. バッチ・データ・ストリームのフレームワークおよびパターンの表を参照してください。 サポート・クラスの列から、データ・ストリームのタイプおよび操作と一致するクラスを選択します。 例えば、テキスト・ファイルかデータを読み取るには、TextFileReader を選択します。
        4. パターン名の列に記載されている、前述のステップで選択したサポート・クラスに対応するインターフェースを実装します。 サポート・クラスは、ストリームおよびバッチ・プログラミング・モデルに関連する記帳アクティビティーをすべて処理します。 実装クラスでは、ストリーム処理ロジックに焦点が当てられています。
        5. xJCL でサポート・クラスおよび実装クラスを宣言します。
        6. ステップで必要なデータ・ストリームごとに、この手順を繰り返します。
    3. ジョブ・ステップ・コンテキストを取得します。
      JobStepContext ctx= JobStepContextMgr.getContext();
      JobStepContextMgr サービス・クラスは、バッチ・ジョブ・ステップが JobStepContext オブジェクトへの参照を取得するのを可能にします。 ジョブ・ステップ・コンテキストには、以下の機能があります。
      • 現行バッチ・ジョブ・ステップが実行されるコンテキストを一意的に識別する情報 (ジョブ ID など) へのアクセス
      • バッチ・ジョブ・ステップの存続期間に、バッチ・プログラミング・フレームワーク・メソッドの間で アプリケーション固有情報を渡すことができる一時的なユーザー・データ域。
      • ステップをまたがってアプリケーション固有情報を渡すことができるパーシスタント・ユーザー・データ域。

      PersistentMap ヘルパー・クラスを使用して、ジョブ・ステップ・コンテキストのパーシスタント・ユーザー・データ域での基本的な型 (boolean や double など) の保管を単純化できます。

    4. コマンド・プロンプトを開き、Java がパス上にあることを確認します。
    5. 次のコマンドをすべて 1 行に入力して実行します。
      [AIX Solaris HP-UX Linux Windows][IBM i]
      java -cp ${WAS_INSTALL_ROOT}/plugins/com.ibm.ws.batch.runtime.jar 
      com.ibm.ws.batch.packager.WSBatchPackager
      	 -appname=<Application_Name>
      	 -jarfile=<jarfile containing the POJO batch steps>
      	 -earfile=<name of the output EAR file without the .ear extension>
      	 [-utilityjars=<semicolon separated list of utility jars>]
      	 [-debug]
      	 [-gridJob]
      例えば、バッチ・ジョブの場合、以下のコマンドを発行します。
      java -cp ${WAS_INSTALL_ROOT}/plugins/com.ibm.ws.batch.runtime.jar 
      com.ibm.ws.batch.packager.WSBatchPackager
      	 -appname=XDCGIVT
      	 -jarfile=XDCGIVTEJBs.jar
      	 -earfile=XDCGIVT
    6. バッチ・アプリケーションをパッケージ化します。

      以下の方法の 1 つを使用します。

      • WSBatchPackager スクリプトを使用して、アプリケーションをパッケージ化してください。
        [AIX Solaris HP-UX Linux Windows]
        <WASHOME>/stack_products/WCG/bin/WSBatchPackager.sh
        		 		 -appname=<application_name>
        		 		 -jarfile=<jar_file_containing_POJO_step_classes>
        		 		 -earfile=<output_ear_file_name>
        		 		 [-utilityjars=<semicolon_separated_utility_jars>]
        		 		 [-nonxadsjndiname=<non-xa_datasource_JNDI_name_for_CursorHoldableJDBCReader>;<non-XA_datasource_JNDI_name_2>;...]
        		 		 [-debug]
        例えば、次のように実行します。
        ./WSBatchPackager.sh -appname=XDCGIVT -jarfile=XDCGIVTEJBs.jar -earfile=XDCGIVT -utilityjars=myutility.jar -nonxadsjndiname=jdbc/ivtnonxa
        例えば、次のように実行します。
        ./WSBatchPackager.sh -Dfile.encoding=ISO8859-1 -appname=XDCGIVT -jarfile=XDCGIVTEJBs.jar -earfile=XDCGIVT -utilityjars=myutility.jar
         -nonxadsjndiname=jdbc/ivtnonxa
        問題の回避: -Dfile.encoding=ISO8859-1を含めないと、コード・ページの違いにより、無効な EAR および Enterprise JavaBeans (EJB) Java アーカイブ (JAR) 記述子が生成されます。
      • java コマンドを使用してアプリケーションをパッケージ化します。

        コマンド・プロンプトを開き、パス上に java があることを確認します。

  • ANT を使用してバッチ・ジョブを作成します。
    1. バッチ・ジョブ・ステップを作成します。
      1. com.ibm.websphere.BatchJobStepInterface インターフェースを実装する Java クラスを作成します。
      2. ビジネス・ロジックを実装します。

        ステップに 1 つの入力ストリームと 1 つの出力ストリームがある場合は、代わりに GenericXDBatchStep の汎用バッチ・ステップを使用することもできます。

    2. バッチ・データ・ストリームを作成します。
      1. com.ibm.websphere.batch.BatchDataStream インターフェースを実装する Java クラスを作成します。

        バッチ・データ・ストリームにはビジネス・ロジックからアクセスします。例えば、jobID と stepID で BatchDataStreamMgr を呼び出すことによってバッチ・ジョブ・ステップからアクセスします。 JobID と stepID は、キー BatchConstants.JOB_ID と BatchConstants.STEP_ID を使用して、ステップ Bean プロパティー・リストから取得します。

      2. BatchConstants.JOB_ID を com.ibm.websphere.batch.JobID にマップし、BatchConstants.STEP_ID を com.ibm.websphere.batch.StepID にマップします。

        BatchConstants クラスへのアクセス権限を既に持っている必要があります。

        バッチ・データ・ストリームのフレームワークには、ファイルやデータベースなどのさまざまなタイプのデータ・ストリームを処理するための、すぐに使えるいくつかのパターンが用意されています。 バッチ・データ・ストリームのフレームワークを使用するには、次のステップを実行します。

        1. TextFile、ByteFile、JDBC、z/OS のストリームなど、操作するデータ・ストリームのタイプを指定します。
        2. ストリームから読み取るか、ストリームに書き込むかを指定します。
        3. バッチ・データ・ストリームのフレームワークおよびパターンの表を参照してください。 サポート・クラスの列から、データ・ストリームのタイプおよび操作と一致するクラスを選択します。 例えば、テキスト・ファイルからデータを読み取るには、TextFileReader を選択します。
        4. パターン名の列に記載されている、前述のステップで選択したサポート・クラスに対応するインターフェースを実装します。 サポート・クラスは、ストリームおよびバッチ・プログラミング・モデルに関連する記帳アクティビティーをすべて処理します。 実装クラスでは、ストリーム処理ロジックに焦点が当てられています。
        5. xJCL でサポート・クラスおよび実装クラスを宣言します。
        6. ステップで必要なデータ・ストリームごとに、この手順を繰り返します。
    3. ジョブ・ステップ・コンテキストを取得します。
      JobStepContext ctx= JobStepContextMgr.getContext();
      JobStepContextMgr サービス・クラスは、バッチ・ジョブ・ステップが JobStepContext オブジェクトへの参照を取得するのを可能にします。 ジョブ・ステップ・コンテキストには、以下の機能があります。
      • 現行バッチ・ジョブ・ステップが実行されるコンテキストを一意的に識別する情報 (ジョブ ID など) へのアクセス
      • バッチ・ジョブ・ステップの存続期間に、バッチ・プログラミング・フレームワーク・メソッドの間で アプリケーション固有情報を渡すことができる一時的なユーザー・データ域。
      • ステップをまたがってアプリケーション固有情報を渡すことができるパーシスタント・ユーザー・データ域。

      PersistentMap ヘルパー・クラスを使用して、ジョブ・ステップ・コンテキストのパーシスタント・ユーザー・データ域での基本的な型 (boolean や double など) の保管を単純化できます。

    4. バッチ・ジョブでは、com.ibm.ws.batch.runtime.jar ファイルがクラスパス上にあることを確認します。
    5. タスクを宣言します。
      次のコマンドを使用してタスクを宣言します。
      <taskdef name="pgcpackager" classname="com.ibm.ws.batch.packager.PGCPackager"
      		classpath="${WAS_INSTALL_ROOT}/plugins/com.ibm.ws.batch.runtime.jar" />
    6. アプリケーションで Java ファイルをコンパイルした後、pgcpackager タスクを呼び出します。
      <pgcpackager appname="<appname>" earFile="<location name of EAR file to generate>" 
      jarfile="location of the POJO jar file"/>	

結果

バッチ・ジョブ・コントローラーと Enterprise JavaBeans (EJB) データ・ストリーム、コマンド行、または ANT ツールを使用して、単純なトランザクション・バッチ・アプリケーションを開発しました。

次の作業

計算主体アプリケーションをインストールし、 WebSphere® グリッド・エンドポイントを構成します。