2. アプリケーションの開発

本編では、OLF/TP Adapterを使ったアプリケーションの開発手順を説明しています。

2.1. 管理環境で動作するAPコンポーネントの開発手順

管理環境で動作するAPコンポーネント の作成は以下の手順に沿って行います。

2.1.1. ホスト側トランザクション処理プログラムの作成
2.1.2. 電文情報ファイルの作成
2.1.3. APコンポーネントの作成
2.1.4. OLF/TP Adapterの配備
2.1.5. APコンポーネントの配備

以下に、APコンポーネント作成の流れの概要を示します。



2.1.1. ホスト側トランザクション処理プログラムの作成

ホスト側トランザクション処理プログラムを作成します。

  1. ホスト側トランザクション処理プログラムは、新規作成、または既存のプログラムを使用します。
  2. ホスト側トランザクション処理プログラムがCOBOLで作成されている場合、OLF/TP Adapterが実行時に参照する電文情報ファイルをコピー句から生成することができます。この場合は、WebOTX Developerがインストールされているマシンにコピー句を転送します。
  3. OLF/TPを利用するためにホスト側に端末の定義を行います。

詳細については、「VIS利用の手引き」、「OLF/TP利用の手引き」を参照してください。


2.1.2. 電文情報ファイルの作成


OLF/TP Adapterが実行時に参照する電文情報ファイルを作成します。

OLF/TP Adapterでは、電文情報ファイルとしてアイテムマップファイルと電文情報クラスを利用することができます。
アイテムマップファイルと電文情報クラスの作成は WebOTX Developer を利用して行います。

2.1.2.1. アイテムマップを使用する場合

    WebOTX Developerに含まれているアイテムマップ生成ウィザードを使用してアイテムマップを作成します。
    アイテムマップ生成ウィザードの使用方法については アプリケーション開発ガイド(Java EE) > 6. コネクタアプリケーションの開発 > 6.2. プログラミング・開発ガイド > 6.2.5. アイテムマップの生成 を参照してください。

2.1.2.2. 電文情報クラスを使用する場合

電文情報クラスは、電文フォーマットクラス、レコードマッピングクラスで構成されます。電文情報クラスの作成方法は、コピー句から作成する方法とテキストエディタを利用して手動で作成する方法があります。

[コピー句から生成する場合]

    WebOTX Developerに含まれている電文情報クラス生成ウィザードを使用して電文フォーマットクラス、レコードマッピングクラスを作成します。
    電文情報クラス生成ウィザードはCOBOLのコピー句を入力として電文フォーマットクラス、レコードマッピングクラスを生成します。
    電文情報クラス生成ウィザードの使用方法については アプリケーション開発ガイド(Java EE) > 6. コネクタアプリケーションの開発 > 6.2. プログラミング・開発ガイド > 6.2.6. 電文情報クラスの生成 を参照してください。

[テキストエディタにより手動で作成する場合]

  1. 電文単位に電文形式を表した電文フォーマットクラスを作成します。電文フォーマットクラスは、jp.co.nec.WebOTX.connector.olftp.cci.Format抽象クラスの実装クラスです。以下に電文フォーマットクラスのサンプルを示します。
    package FTTest;
    import jp.co.nec.WebOTX.connector.olftp.cci.*;
    import jp.co.nec.WebOTX.convert.*;

    public class MU0010 extends Format {
        private static MU0010 fmt = null;

        private MU0010() throws Exception {
            addFieldInfoString("NAME",0,10,CodeConverter.MIXTYPE_2BYTE,CodeConverter.ALIGN_LEFT,false);
            addFieldInfoString("ADDR",10,100,CodeConverter.MIXTYPE_MIX,CodeConverter.ALIGN_LEFT,false);
        }

        public static Format getInstance() throws Exception {
            synchronized(MU0010.class){
                if(null == fmt){
                    fmt = new MU0010();
                }
             }
             return fmt;
        }
     
      public int getLength(){return 110;}
    }

    (1)コンストラクタによりフィールド属性(フィールド名、データオフセット、データ長、データ属性の情報)を定義します。フィールド属性は電文の先頭から順に定義します。フィールド属性を追加するためのメソッドは、OLF/TP Adapterの「リファレンスマニュアル」を参照してください。

    (2)電文フォーマットクラスをインスタンス化するためのgetInstanceメソッドを用意します。getInstanceメソッドはstaticである必要があります。

    (3)電文長を返却するgetLengthメソッドを用意します。

  2. レコードマッピングクラスを作成します。レコードマッピングクラスは、jp.co.nec.WebOTX.connector.olftp.cci.IWebOTXRecordMapの実装クラスです。レコードマッピングクラスのクラス名は、WebOTXRecordMap(固定)です。以下にレコードマッピングクラスのサンプルを示します。
    package FTTest;
    import java.util.*;
    import jp.co.nec.WebOTX.connector.olftp.cci.*;
    import jp.co.nec.WebOTX.convert.*;

    public class WebOTXRecordMap implements IWebOTXRecordMap {
         private static WebOTXRecordMap rmp = null;
         private HashMap recordMap = null;

         private WebOTXRecordMap() throws Exception {
             recordMap = new HashMap(3);
             recordMap.put("ECHO11", "ECHO11Rec");
             recordMap.put("SEARCH", "SEARCHRec");
             recordMap.put("MU0011", "MU0010Rec");
         }

         public static IWebOTXRecordMap getInstance() throws Exception {
             synchronized(WebOTXRecordMap.class){
                 if(null == rmp){
                    rmp = new WebOTXRecordMap();
                }
            }
            return rmp;
        }

        public Map getMap(){
            return this.recordMap;
        }
    }

    (1)コンストラクタによりトランザクションIDと電文フォーマットクラス名との対応を定義します。定義はHashMapクラスに格納します。HashMapクラスには、トランザクションIDをキーに電文フォーマットクラス名を格納します。

    (2)レコードマッピングクラスをインスタンス化するためのgetInstanceメソッドを用意します。getInstanceメソッドはstaticである必要があります。

    (3)マッピング情報を返却するためのgetMapメソッドを用意します。

※電文フォーマットクラス、レコードマッピングクラスのコンパイルには、次のjarファイルをコンパイル時のクラスパスに通しておく必要があります。


2.1.3. APコンポーネントの作成

管理環境下で動作するAPコンポーネントは、APサーバの提供するプール管理機能、セキュリティ管理機能を利用することができます。OLF/TP Adapterを利用するAPコンポーネントは、JCAのCCI(Common Client Interface)を使用してホストと通信します。

2.1.3.1. Connectionの取得

APコンポーネントは、Connectionと呼ばれるホストとの論理パスを使用しホストと通信します。Connectionを取得するために、APコンポーネントは、JNDIからConnectionFactoryを取得します。APコンポーネントはConnectionFactoryのgetConnection()メソッドによりConnectionを取得します。APコンポーネントは、ConnectionFactoryのgetConnection()メソッドを呼び出すことで、APサーバがプーリングしている論理パスを取得することができます。APサーバのプールに利用可能な論理パスが無い場合、APサーバにより新しい論理パスが生成されます。以下にConnection取得時のコーディング例を示します。

    javax.resource.cci.Connection con = null;
    try {
        Context ic = new InitialContext();
        javax.resource.cci.ConnectionFactory cf = (javax.resource.cci.ConnectionFactory)ic.lookup("java:comp/env/ACOSAdapt");
        con = cf.getConnection();
    } catch (Exception ex) {
        throw ex;
    } finally {
        try {
            if(null != con ) {
                con.close();
            }
        }catch(Exception e){
        }
    }

APコンポーネントは、ConnectionFactoryのgetConnection()メソッドで、ユーザ名、パスワードを指定することができます。この場合、APサーバはユーザ名、パスワードが同一である論理パスをAPサーバから返却します。該当する論理パスがプール中に存在しない場合、新しい論理パスを作成します。特定のユーザで論理パスを占有する場合に使用します。ユーザ名、パスワードを指定する場合のコーディング例を以下に示します。

    javax.resource.cci. Connection con = null;
    try {
        Context ic = new InitialContext();
        javax.resource.cci.ConnectionFactory cf = (javax.resource.cci.ConnectionFactory)ic.lookup("java:comp/env/ACOSAdapt");
        jp.co.nec.WebOTX.connector.olftp.cci.ConnectionSpecImpl conspec = 
           new jp.co.nec.WebOTX.connector.olftp.cci.ConnectionSpecImpl();
      conspec.setUserName("NECCorp");
      conspec.setPassword("password");
        con = cf.getConnection(conspec);
    } catch (Exception ex) {
        throw ex;
    } finally {
        try {
            if(null != con ) {
                con.close();
            }
        }catch(Exception e){
        }
   }

ユーザ名とパスワードを指定して論理パスを取得するには、APコンポーネント登録時のリソース参照定義においてアプリケーション管理サインオンを選択している必要があります。アプリケーション管理サインオンの設定方法については、APサーバのマニュアルを参照してください。

2.1.3.2. データの入出力

APコンポーネントは、CCIの提供するRecordインタフェースを使用して送信データを設定し、受信データを取得をします。OLF/TP Adapterでは、CCIが定義しているIndexedRecord、及びMappedRecordをサポートしています。IndexedRecordはjava.util.Listインタフェースを持ち、電文イメージと同じ順序でデータを格納します。MappedRecordはjava.uti.lMapインタフェースを持ち、COBOL名標を指定したデータアクセスが可能です。APコンポーネントはCCIのRecordFactoryクラスを使用してIndexedRecord、MappedRecordのインスタンスを取得します。

以下に、APコンポーネントからMappedRecordを使って送信データを設定する場合のコーディング例を示します。

javax.resource.cci. ConnectionFactory cf = (javax.resource.cci.ConnectionFactory)ic.lookup("java:comp/env/ACOSAdapt");
javax.resource.cci.RecordFactory rf = cf.getRecordFactory();
javax.resource.cci.MappedRecord rec_in = rf.createMappedRecord("SearchRec");
rec_in.put("CustomerID", "A0000001");
javax.resource.cci.MappedRecord rec_out = rf.createMappedRecord("");

APコンポーネントは、ConnectionFactoryからRecordFactoryを取得します。APコンポーネントは、RecordFactoryから送信データ格納用MappedRecordを取得します。このとき、送信電文に対応するレコード名を指定します。レコード名は、送信電文に対応する電文フォーマットクラス名を指定します。APコンポーネントは、取得したMappedRecordに対して、COBOL名標を指定して送信データを設定します。本例では、コピー句のCustomerIDフィールドに値("A0000001")を設定しています。COBOL名標の詳細については、「MappedRecordで指定するCOBOL名標」を参照してください。受信データ格納用のRecordを生成する場合、レコード名に空文字を指定して生成します。

以下に、APコンポーネントからIndexedRecordを使用した場合のコーディング例を示します。

javax.resource.cci. ConnectionFactory cf = (javax.resource.cci.ConnectionFactory)ic.lookup("java:comp/env/ACOSAdapt");
javax.resource.cci.RecordFactory rf = cf.getRecordFactory();
javax.resource.cci.IndexedRecord rec_in = rf.createIndexedRecord("CustomerInfoRec");
rec_in.add("A0000001");
rec_in.add("日電 太郎");
rec_in.add("東京都港区芝");
javax.resource.cci.MappedRecord rec_out = rf.createIndexedRecord("");

IndexedRecordのインスタンスはRecordFactoryから取得します。IndexedRecordのインスタンスを取得する場合は、送信電文に対応する電文フォーマットクラス名をレコード名として指定します。APコンポーネントは、コピー句の定義と同じ順序で送信データを設定します。本例は、顧客番号、氏名、住所の順でコピー句が定義されている場合のサンプルです。受信データ格納用のRecordを生成する場合、レコード名に空文字を指定して生成します。

MappedRecordとIndexedRecordは、組み合わせて使用することにより、COBOLの繰返し項目や集団項目へアクセスするといったことも実現できます。詳細な方法につきましては「MappedRecordでのデータアクセス方法」をご覧ください。

2.1.3.3. 送受信

APコンポーネントは、CCIの提供するInteractionインタフェースを使用してホストと通信します。APコンポーネントはInteractionのexecute()メソッドを使用して、ホストに対して送受信します。Interactionは、Connectionから取得します。以下にAPコンポーネントがホストと通信する場合のコーディング例を示します。

    javax.resource.cci.Connection con = null;
    try {
      Context ic = new InitialContext();
      javax.resource.cci. ConnectionFactory cf = (javax.resource.cci.ConnectionFactory)ic.lookup("java:comp/env/ACOSAdapt");
      javax.resource.cci.RecordFactory rf = cf.getRecordFactory();
      javax.resource.cci.MappedRecord rec_in = rf.createMappedRecord("SearchRec");
      rec_in.put("CustomerID", "A0000001");
      javax.resource.cci.MappedRecord rec_out = rf.createMappedRecord("");

  //Connectionの取得
      con = cf.getConnection();

     //Interactionの取得
      javax.resource.cci.Interaction inter = con.createInteraction();
      jp.co.nec.WebOTX.connector.olftp.cci.InteractionSpecImpl spec = 
              new jp.co.nec.WebOTX.connector.olftp.cci.InteractionSpecImpl();
      spec.setTXID("MU0010");

  //送受信
      inter.execute(spec, rec_in, rec_out);

      String username = (String)rec_out.get("CustomerName");
      String address = (String)rec_out.get("Addr");
    } catch (Exception ex) {
        throw ex;
    } finally {
        try {
            if(null != inter ) {
                //Interactionの解放
                inter.close();
            }
            if(null != con ) {
                //Connectionの解放
                con.close();
            }
        }catch(Exception e){
        }
    }

APコンポーネントは、Interactionのexecute()メソッドを使用してホストと送受信します。ホストと送受信する場合、起動するトランザクションを識別する値(トランザクションID)を指定します。APコンポーネントはInteractionSpecImplにトランザクションIDを設定してexecuteメソッドを呼び出します。Interactionの利用を終えた場合は、Interactionをcloseしてください。

2.1.3.4. Connectionの解放

ホストとの通信を終えた場合、APコンポーネントが使用しているConnectionをcloseしてください。Connectionをcloseすると、使用していた論理パスは、APサーバにプーリングされ、他のAPコンポーネントから再利用されます。APコンポーネントがConnectionをcloseしないで終了した場合、論理パスはプールに返却されずメモリリークすることになります。メモリリークした論理パスは、APサーバの提供する論理パスのガベージ機能により解放してください。APサーバのガベージ機能については、APサーバのマニュアルを参照してください。


2.1.4. OLF/TP Adapterの配備

管理環境で動作するAPコンポーネントからOLF/TP Adapterを利用するには、OLF/TP Adapterのrarファイルを配備しておく必要があります。 OLF/TP Adapterのrarファイルの配備形態としては、以下の2通りの形態があります。

OLF/TP Adapterのrarファイルは、以下の手順で管理環境に配備します。

  1. 通信定義ファイルの編集
  2. 配備記述子(ra.xml)の編集
  3. rarファイルのパッケージ化
  4. rarファイルの配備

2.1.4.1. 通信定義ファイルの編集

OLF/TP Adapterが使用する通信リソース、及び接続先ホストについての定義を行います。

定義は、<OLF/TP Adapterインストールディレクトリ>/Adapter/OLFTP/Run/conf配下のサンプルファイル(OLFAdapter.ini, OLFAdapter.xml)を編集して行います。編集は、テキストエディタで行ってください。

定義内容の詳細については、 [ 運用ガイド > 4.3.1. 通信環境定義(OlfAdapter.ini) ]、 [ 運用ガイド > 4.3.2. 端末定義(OlfAdapter.xml) ] を参照してください。

定義を行った後、定義ファイルをOLF/TP Adapterを配備するマシンに転送してください。

2.1.4.2. 配備記述子(ra.xml)の編集

OLF/TP Adapterの配備記述子を環境に応じて編集します。

配備記述子の編集は、WebOTX Developerを使用して行います。手順については、 「WebOTX Application Server 共通マニュアル」- 「アプリケーション開発ガイド」-「3. JavaEE」-「3.7. コネクタアプリケーションの開発」 を参照してください。

OLF/TP Adapterの配備記述子の詳細については、 [ 運用ガイド > 4.3.3. 配備記述子(ra.xml) ]

2.1.4.3. rarファイルのパッケージ化

OLF/TP Adapterのrarファイルをパッケージ化します。

パッケージ化は、WebOTX Developerを使用して行います。 手順については、 「WebOTX Application Server 共通マニュアル」- 「アプリケーション開発ガイド」-「3. JavaEE」-「3.7. コネクタアプリケーションの開発」を参照してください。

2.1.4.4. rarファイルの配備

OLF/TP Adapterのrarファイルを管理環境に配備します。

rarファイルを配備する方法は次の2つがあります。

[運用管理コマンドによる配備]

    WebOTXが提供する運用管理コマンドにより、rarファイルを配備します。

    [例] rarファイルの配備

    deploy --user admin "C:\work\olftpcon.rar"

    コマンドの詳細については、[ ドメイン構築・基本設定ガイド ]をご覧ください。

[統合運用管理ツールによる配備]

    WebOTXが提供する統合運用管理ツールにより、rarファイルを配備します。

    ドメインツリー上で、アプリケーションを選択し右クリックメニューの「コンポーネントの配備」を選択します。

    コンポーネント配備ウィザードでは、「コンポーネントタイプ」に「リソースアダプタ」、「ファイル」でrarファイルの場所を指定します。

    「配備」ボタンを押下し、配備を行います。

2.1.5. APコンポーネントの配備

OLF/TP Adapterを利用するAPコンポーネントを管理環境に配備します。

APコンポーネントを配備する方法は次の2つがあります。

[運用管理コマンドによる配備]

    WebOTXが提供する運用管理コマンドにより、APコンポーネントを管理環境に配備します。

    [例]APコンポーネントの配備

    deploy --user admin --apgroup apg1 --pgroup pg1 "C:\work\sample.ear"

    運用管理コマンドの詳細については、[ ドメイン構築・基本設定ガイド ]を参照してください。

[統合運用管理ツールによる配備]

    WebOTXが提供する統合運用管理ツールにより、APコンポーネントを配備します。

    ドメインツリー上で、アプリケーションを選択し右クリックメニューの「コンポーネントの配備」を選択します。

    コンポーネント配備ウィザードでは、「コンポーネントタイプ」に「Java EEアプリケーション」、「ファイル」でearファイルの場所を指定します。

    基本関連情報画面では、アプリケーショングループ、プロセスグループを指定します。

    「配備」ボタンを押下し、配備を行います。


2.2. 非管理環境で動作するAPコンポーネントの開発手順

OLF/TP Adapterは、APサーバのない環境で動作するAPコンポーネントから使用することができます。APサーバのない環境を非管理環境と呼びます。APコンポーネントは、管理環境と同様の手順でホストと通信できます。ただし、非管理環境では、APコンポーネントがOLF/TP Adapterを配備します。OLF/TP Adapterでは、OLF/TP Adapterを配備するためのインタフェースをAPコンポーネントに対して提供しています。また、OLF/TP Adapterでは、コネクションプーリング、セキュリティ機能を提供しています。
非管理環境で動作するAPコンポーネント の作成は以下の手順に沿って行います。

2.2.1. ホスト側トランザクション処理プログラムの作成
2.2.2. 電文情報ファイルの作成
2.2.3. APコンポーネントの作成
2.2.4. OLF/TP Adapterの配備

以下に、APコンポーネント作成の流れの概要を示します。

2.2.1. ホスト側トランザクション処理プログラムの作成

ホスト側トランザクション処理プログラムの作成手順は、管理環境の場合と同様です。
2.1.1. ホスト側トランザクション処理プログラムの作成」を参照してください。

2.2.2. 電文情報ファイルの作成

電文情報ファイルの作成手順は、管理環境の場合と同様です。
2.1.2. 電文情報ファイルの作成」を参照してください。

2.2.3. APコンポーネントの作成

APコンポーネントの作成手順は、管理環境の場合と同様です。
2.1.3. APコンポーネントの作成」を参照してください。

2.2.4. OLF/TP Adapterの配備

非管理環境で動作するAPコンポーネントからOLF/TP Adapterを利用するには、 OLF/TP Adapterを配備しておく必要があります。 非管理環境では、APコンポーネントにOLF/TP Adapterを配備するコードを記述します。

OLF/TP Adapterは、以下の手順で非管理環境に配備します。

  1. 通信定義ファイルの編集
  2. 配備記述子(ra.xml)の編集
  3. WebOTX固有機能定義(nec-j2ee.xml)の編集
  4. OLF/TP Adapterの配備

2.2.4.1. 通信定義ファイルの編集

通信定義ファイルの編集手順は、管理環境の場合と同様です。
2.1.4.1. 通信定義ファイルの編集」を参照してください。

※非管理環境の場合、アイテムマップを使用する場合は必ず通信環境定義(OLFAdapter.ini)にcddpathプロパティを指定する必要があります。

2.2.4.2. 配備記述子(ra.xml)の編集

配備記述子の編集手順は、管理環境の場合と同様です。
2.1.4.2. 配備記述子(ra.xml)の編集」を参照してください。

2.2.4.3. WebOTX固有機能定義(nec-j2ee.xml)の編集

OLF/TP Adapterが提供するプール管理機能についての定義を行います。

WebOTX固有機能定義(nec-j2ee.xml)ファイルは、 [ 運用ガイド > 4.3.4. WebOTX固有機能定義(nec-j2ee.xml) ] の記載例を参考に手動で作成し編集してください。

定義を行った後、定義ファイルをOLF/TP Adapterを配備するマシンに転送してください。

2.2.4.4. OLF/TP Adapterの配備

OLF/TP Adapterを非管理環境に配備するには、非管理環境のクラスパスにOLF/TP Adapterのjarファイルを追加します。追加するjarファイルは以下の通りです。

これらのjarファイルは、<OLF/TP Adapterインストールディレクトリ>/Adapter/OLFTP/Run/lib配下に格納しています。


(1)OLF/TP Adapterの配備

APコンポーネントからOLF/TP Adapterを利用する場合、OLF/TP Adapterをあらかじめ配備しておく必要があります。非管理環境では、APコンポーネントにおいて配備処理を記述する必要があります。OLF/TP Adapterは、APコンポーネントに対して配備のためのインタフェースを提供しています。以下に配備処理のコーディング例を示します。

String rafile = "C:\\olfconf\\ra.xml";
String otxrafile = "C:\\olfconf\\nec-j2ee.xml";
String displayName = "OLFTP";
try{
    jp.co.nec.WebOTX.connector.olftp.util.OLFConfiguration.deploy(rafile, otxrafile);
}catch(Exception e){
    e.printStackTrace();
        return;
}

try{
   jp.co.nec.WebOTX.connector.olftp.util.OLFConnectorManager man = 
                jp.co.nec.WebOTX.connector.olftp.util.OLFConnectorManager.getInstance();
   man.start(displayName);
}catch(Exception e){
        e.printStackTrace();
        return;
}

APコンポーネントは、OLF/TP Adapterの提供するOLFConfigrationクラスのdeploy()メソッドを使用してOLF/TP Adapterを配備します。APコンポーネントは、OLF/TP Adapterの提供するOLFConnectorManagerのstart()メソッドを使用してコネクションプーリングを開始します。コネクションプーリングを開始すると、ホストとの通信が可能になります。start()メソッドで指定するdisplayNameには、ra.xmlの<display-name>で指定した値を指定します。

(2)OLF/TP Adapterの配備解除

APコンポーネントでOLF/TP Adapterの利用を終えた場合、OLF/TP Adapterを配備解除します。OLF/TP Adapterは、配備解除時にホストとの論理パスを解放します。OLF/TP Adapterは、APコンポーネントに対して配備解除のためのインタフェースを提供しています。以下に配備解除処理のコーディング例を示します。

try{
   jp.co.nec.WebOTX.connector.olftp.util. OLFConnectorManager man = 
                jp.co.nec.WebOTX.connector.olftp.util.OLFConnectorManager.getInstance();
   man.stop(displayName, true);
}catch(Exception e){
        e.printStackTrace();
        return;
}
try{
    jp.co.nec.WebOTX.connector.olftp.util.OLFConfiguration.undeploy(displayName);
}catch(Exception e){
    e.printStackTrace();
        return;
}

APコンポーネントは、OLF/TP Adapterの提供するOLFConnectorManagerのstop()メソッドを使用してコネクションプーリングを終了します。コネクションプーリングを終了すると、ホストとの通信は行えません。stop()メソッドで指定するdisplayNameには、ra.xmlで指定したdisplay-nameを指定します。プーリングの終了には、強制終了と、予閉塞の2通りの終了方法があります。これらはstopメソッドのパラメータで指定します。APコンポーネントは、OLF/TP Adapterの提供するOLFConfigrationクラスのundeploy()メソッドを使用してOLF/TP Adapterを配備解除します。