|
|
WebOTX Manual V10.4 (第4版) 目次を表示 |
本編では、OLF/TP Adapterを使ったアプリケーションの開発手順を説明しています。
管理環境で動作するAPコンポーネント の作成は以下の手順に沿って行います。
開発したAPコンポーネントを動作させるには、いくつかの設定が必要です。詳細は[ 操作方法・設定 > OLF/TP Adapter の運用手順と設定 > 運用 > 管理環境での運用 ]を参照してください。
以下に、APコンポーネント作成の流れの概要を示します。

ホスト側トランザクション処理プログラムを作成します。
詳細については、ACOS4と接続する場合は「VIS利用の手引き」、「OLF/TP利用の手引き」を、TPBASEと接続する場合はTPBASEのマニュアルを参照してください。
OLF/TP Adapterが実行時に参照する電文情報ファイルを作成します。
OLF/TP Adapterでは、電文情報ファイルとしてアイテムマップファイルと電文情報クラスを利用することができます。
アイテムマップファイルと電文情報クラスの作成は WebOTX Developer を利用して行います。
WebOTX Developerに含まれているアイテムマップ生成ウィザードを使用してアイテムマップを作成します。
アイテムマップ生成ウィザードの使用方法については、
[ Developer(with Developer's Studio)
> アプリケーション開発 > その他のアプリケーション > コネクタアプリケーション
> プログラミング・開発ガイド
> アイテムマップの生成
]を参照してください。
また、WebOTX Developerに含まれているCOBOL Data Composerを使用してアイテムマップを作成することもできます。
COBOL Data Composerの使用方法については
[ 操作方法・設定 > COBOL Data Composerの操作方法 ]を参照してください。
電文情報クラスは、電文フォーマットクラス、レコードマッピングクラスで構成されます。電文情報クラスの作成方法は、コピー句から作成する方法とテキストエディタを利用して手動で作成する方法があります。
[コピー句から生成する場合]
[テキストエディタにより手動で作成する場合]
| 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の「リファレンス > APIリファレンス」を参照してください。
(2)電文フォーマットクラスをインスタンス化するためのgetInstanceメソッドを用意します。getInstanceメソッドはstaticである必要があります。
(3)電文長を返却するgetLengthメソッドを用意します。
| 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; } } |
(2)レコードマッピングクラスをインスタンス化するためのgetInstanceメソッドを用意します。getInstanceメソッドはstaticである必要があります。
(3)マッピング情報を返却するためのgetMapメソッドを用意します。
※電文フォーマットクラス、レコードマッピングクラスのコンパイルには、次のjarファイルをコンパイル時のクラスパスに通しておく必要があります。
管理環境下で動作するAPコンポーネントは、APサーバの提供するプール管理機能、セキュリティ管理機能を利用することができます。OLF/TP Adapterを利用するAPコンポーネントは、JCAのCCI(Common Client Interface)を使用してホストと通信します。
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サーバのマニュアルを参照してください。
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.IndexedRecord rec_out = rf.createIndexedRecord(""); |
IndexedRecordのインスタンスはRecordFactoryから取得します。IndexedRecordのインスタンスを取得する場合は、送信電文に対応する電文フォーマットクラス名をレコード名として指定します。APコンポーネントは、コピー句の定義と同じ順序で送信データを設定します。本例は、顧客番号、氏名、住所の順でコピー句が定義されている場合のサンプルです。受信データ格納用のRecordを生成する場合、レコード名に空文字を指定して生成します。
MappedRecordとIndexedRecordは、組み合わせて使用することにより、COBOLの繰返し項目や集団項目へアクセスするといったことも実現できます。詳細な方法につきましては「MappedRecordでのデータアクセス方法」をご覧ください。
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してください。
ホストとの通信を終えた場合、APコンポーネントが使用しているConnectionをcloseしてください。Connectionをcloseすると、使用していた論理パスは、APサーバにプーリングされ、他のAPコンポーネントから再利用されます。APコンポーネントがConnectionをcloseしないで終了した場合、論理パスはプールに返却されずメモリリークすることになります。メモリリークした論理パスは、APサーバの提供する論理パスのガベージ機能により解放してください。APサーバのガベージ機能については、APサーバのマニュアルを参照してください。
OLF/TP Adapterのrarファイルは、以下の手順で管理環境に配備します。
OLF/TP Adapterが使用する通信リソース、及び接続先ホストについての定義を行います。
定義は、<OLF/TP Adapterインストールディレクトリ>/Adapter/OLFTP/Run/conf配下のサンプルファイル(OLFAdapter.ini, OLFAdapter.xml)を編集して行います。編集は、テキストエディタで行ってください。
定義内容の詳細については、 [操作方法・設定 > OLF/TP Adapter の運用手順と設定 > 設定 > 通信環境定義(OlfAdapter.ini) ]、 [操作方法・設定 > OLF/TP Adapter の運用手順と設定 > 設定 > 端末定義(OlfAdapter.xml) ] を参照してください。
定義を行った後、定義ファイルをOLF/TP Adapterを配備するマシンに転送してください。
OLF/TP Adapterの配備記述子を環境に応じて編集します。
配備記述子の編集は、WebOTX Developerを使用して行います。手順については、 [ Developer(with Developer's Studio) > アプリケーション開発 > その他のアプリケーション > コネクタアプリケーション] を参照してください。
OLF/TP Adapterの配備記述子の詳細については、 [操作方法・設定 > OLF/TP Adapter の運用手順と設定 > 設定 > 配備記述子(ra.xml) ]
OLF/TP Adapterのrarファイルをパッケージ化します。
パッケージ化は、WebOTX Developerを使用して行います。 手順については、 [ Developer(with Developer's Studio) > アプリケーション開発 > その他のアプリケーション > コネクタアプリケーション] を参照してください。
イベントログやsyslogにエラー情報を記録するために、セキュリティポリシーを追加します。
手順については、 [操作方法・設定 > OLF/TP Adapter の運用手順と設定 > 設定 > セキュリティポリシー(server.policy) ] を参照してください。
OLF/TP Adapterのrarファイルを管理環境に配備します。
以下のいずれかの方法で、rarファイルを配備してください。
[運用管理コマンド(otxadmin)による配備]
| deploy "C:\work\olftpcon.rar" |
[運用管理コンソールによる配備]

WebOTX Application Server Standard上でOLF/TP Adapterのrarファイルを動作させる場合、リソースアダプタの設定を変更します。
OLF/TP Adapterを利用するAPコンポーネントの配備先によって、設定内容が異なります。
以下のいずれかの方法で、リソースアダプタの設定変更を行ってください。
[運用管理コマンド(otxadmin)による設定]
| set server.applications.connector-module.<アプリケーション名>.module.<アプリケーション名>.engine.connector.connector-module-config.use-all-ejb-processgroups=false |
| set server.applications.connector-module.olftpcon.module.olftpcon.engine.connector.connector-module-config.use-all-ejb-processgroups=false |
| set server.applications.connector-module.<アプリケーション名>.module.<アプリケーション名>.engine.connector.connector-module-config.use-jmx-agent=false |
| set server.applications.connector-module.olftpcon.module.olftpcon.engine.connector.connector-module-config.use-jmx-agent=false |
[運用管理コンソールによる設定]

OLF/TP Adapterを利用するAPコンポーネントを配備します。
以下のいずれかの方法で、APコンポーネントを配備してください。
[運用管理コマンド(otxadmin)による配備]
| deploy --apgroup apg1 --pgroup pg1 "C:\work\sample.ear" |
[運用管理コンソールによる配備]

開発したAPコンポーネントを動作させるには、いくつかの設定が必要です。詳細は[ 操作方法・設定 > OLF/TP Adapter の運用手順と設定 > 運用 > 管理環境での運用 ]を参照してください。
OLF/TP Adapterは、WebアプリケーションなどJCAコンテナ以外で動作するAPコンポーネントから使用することができます。このようなJCAコンテナ以外の動作環境を非管理環境と呼びます。APコンポーネントは、管理環境と同様の手順でホストと通信できます。
ただし、非管理環境でOLF/TP Adapterを利用するアプリケーションは、管理環境の場合と異なり配備処理を実装する必要があります。
非管理環境で動作するAPコンポーネント の作成は以下の手順に沿って行います。
以下に、APコンポーネント作成の流れの概要を示します。

ホスト側トランザクション処理プログラムの作成手順は、管理環境の場合と同様です。
「管理環境で動作するAPコンポーネントの開発手順 > ホスト側トランザクション処理プログラムの作成」を参照してください。
OLF/TP Adapterが実行時に参照する電文情報ファイルを作成します。
OLF/TP Adapterでは、電文情報ファイルとしてアイテムマップファイルと電文情報クラスを利用することができます。
アイテムマップファイルや電文情報クラスを作成する手順は、[操作方法・設定 > COBOL Data Composerの操作方法] もしくは[操作方法・設定 > ジェネレータの操作方法]を参照してください。
APコンポーネントの作成手順は、基本的には管理環境の場合と同様です。
「管理環境で動作するAPコンポーネントの開発手順 > APコンポーネントの作成」を参照してください。
ただし、JNDIサーバからlookupする際に指定する名称が、管理環境とは異なります。非管理環境ではnec-j2ee.xmlのjndi-nameで指定した名称のみを指定してください。"java:comp/env/"は不要です。
OLF/TP Adapterは、以下の手順で非管理環境に配備します。
通信定義ファイルの編集手順は、管理環境の場合と同様です。
「管理環境で動作するAPコンポーネントの開発手順 > 通信定義ファイルの編集」を参照してください。
※非管理環境の場合、アイテムマップを使用する場合は必ず通信環境定義(OLFAdapter.ini)にcddpathプロパティを指定する必要があります。
配備記述子の編集手順は、管理環境の場合と同様です。
「管理環境で動作するAPコンポーネントの開発手順 > 配備記述子(ra.xml)の編集」を参照してください。
OLF/TP Adapterが提供するプール管理機能についての定義を行います。
WebOTX固有機能定義(nec-j2ee.xml)ファイルは、 [操作方法・設定 > OLF/TP Adapter の運用手順と設定 > 設定 > WebOTX固有機能定義(nec-j2ee.xml) ] の記載例を参考に手動で作成し編集してください。
定義を行った後、定義ファイルをOLF/TP Adapterを配備するマシンに転送してください。
OLF/TP Adapterを非管理環境に配備するには、非管理環境のクラスパスにOLF/TP Adapterのjarファイルを追加します。追加するjarファイルは以下の通りです。
これらのjarファイルは、<OLF/TP Adapterインストールディレクトリ>/Adapter/OLFTP/Run/lib配下に格納しています。
また、後述する処理を組み込んだAPコンポーネントをビルドするには、<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を配備解除します。