Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編) |
目次 索引 |
第3章 クライアントアプリケーションの作成 | > 3.3 クライアントアプリケーションソースの作成(COBOL) | > 3.3.2 ソースの作成 |
動的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。
初期化処理として、ORBのオブジェクトリファレンスを取得します。オブジェクトリファレンスを取得するには、初期化メソッドを呼び出します。記述例を以下に示します。
IDENTIFICATION DIVISION. PROGRAM-ID. "CLIENT-MAIN". AUTHOR. OD/IDLCOMPILER VER.2.0. INSTALLATION. IDL FILE NAME IS COBSAMPLE.IDL. SECURITY. THIS SOURCE CODE WAS GENERATED BASE ON YOUR IDL FILE. WHEN THIS STUB/SKELETON SOURCE CODE IS CHANGED, THE OPERATION. GURANTEED IS NOT DONE. DATE-WRITTEN. TUE MAY 6 11:03:40 1999 * ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. ARGUMENT-NUMBER IS ARG-C ARGUMENT-VALUE IS ARG-V SYMBOLIC CONSTANT COPY SYMBOL-CONST IN CORBA. . * DATA DIVISION. WORKING-STORAGE SECTION. COPY CONST IN CORBA. COPY CONST IN COSTRANSACTIONS. 01 COPY CURRENT IN COSTRANSACTIONS REPLACING COSTRANSACTIONS-CURRENT BY CURRENT-OBJ. 01 COPY BOOLEAN IN CORBA REPLACING CORBA-BOOLEAN BY REPORT-HEURISTICS. 01 COPY FLAGS IN CORBA REPLACING CORBA-FLAGS BY FLAG. 01 TEMP-BUF USAGE POINTER. 01 MESS PIC X(30). 01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY STRING-LENGTH. 01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB. 01 COPY BOA IN CORBA REPLACING CORBA-BOA BY BOA. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 01 BUF USAGE IS POINTER. 01 COPY BOOLEAN IN CORBA REPLACING CORBA-BOOLEAN BY BL. 01 WORK-POINTER USAGE POINTER. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY TMP-CONT. 01 ARG-LIST USAGE POINTER. 01 COPY STATUS IN CORBA REPLACING CORBA-STATUS BY RET-VAL. 01 COPY NVLIST IN CORBA REPLACING CORBA-NVLIST BY N-LIST. 01 COPY TYPECODE IN CORBA REPLACING CORBA-TYPECODE BY TMP-TYPE. 01 STRING-POINTER USAGE POINTER. 01 PARAM-POINTER USAGE POINTER. 01 COPY CONTEXT IN CORBA REPLACING CORBA-CONTEXT BY CTX. 01 COPY REQUEST IN CORBA REPLACING CORBA-REQUEST BY REQ. 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM. 01 COPY BOOLEAN IN CORBA REPLACING CORBA-BOOLEAN BY RET. 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY I. 01 BUFFER USAGE POINTER. 01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY BUF-LENGTH. 01 STR-BUF PIC X(30). 01 COPY COSNAMING-NAMINGCONTEXT IN CORBA REPLACING COSNAMING-NAMINGCONTEXT BY COS-NAMING. 01 COPY COSNAMING-NAME IN CORBA REPLACING COSNAMING-NAME BY NAME. 01 NAME-A USAGE POINTER. 01 COPY COSNAMING-NAMECOMPONENT IN CORBA REPLACING COSNAMING-NAMECOMPONENT BY NAME-COMPONENT. 01 NAME-COMPONENT-A USAGE POINTER. 01 COPY INTERFACEDEF IN CORBA REPLACING CORBA-INTERFACEDEF BY INTF-INTF. 01 COPY DEFINITIONKIND IN CORBA REPLACING CORBA-DEFINITIONKIND BY DK-FLAG. 01 INTF-OPR USAGE POINTER. 01 DESCRIPTION USAGE POINTER. *########## ORB SETTING PARAMETER ######### 01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY CURRENT-ARG-C. 01 CURRENT-ARG-V. 02 FILLER OCCURS 6. 03 CURRENT-ARG-V-VALUE USAGE POINTER. 01 APLI-NAME PIC X(8) VALUE "simple_c". 01 TMP-STRING-BUF PIC X(20). 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY ARG-COUNT. * PROCEDURE DIVISION. MAIN. * ODのObjectIDを設定 DISPLAY "CLIENT START!!". * argument set : CURRENT-ARG-V-VALUE ACCEPT CURRENT-ARG-C FROM ARG-C. COMPUTE CURRENT-ARG-C = CURRENT-ARG-C + 1. PERFORM VARYING ARG-COUNT FROM 1 BY 1 UNTIL ARG-COUNT > CURRENT-ARG-C IF ARG-COUNT = 1 MOVE APLI-NAME TO TMP-STRING-BUF ELSE ACCEPT TMP-STRING-BUF FROM ARG-V END-IF MOVE FUNCTION LENG (TMP-STRING-BUF) TO STRING-LENGTH CALL "CORBA-STRING-SET" USING CURRENT-ARG-V-VALUE (ARG-COUNT) STRING-LENGTH TMP-STRING-BUF END-PERFORM. SET CURRENT-ARG-V-VALUE (ARG-COUNT) TO NULL. * OD初期化 MOVE 12 TO STRING-LENGTH. CALL "CORBA-STRING-SET" USING TEMP-BUF STRING-LENGTH FJ-OM-ORB-ID. CALL "CORBA-ORB-INIT" USING CURRENT-ARG-C CURRENT-ARG-V TEMP-BUF ENV ORB. * ORBIDに格納した領域を解放する CALL "CORBA-FREE" USING TEMP-BUF. MOVE "CORBA-ORB-INIT" TO MESS. PERFORM ENV-CHECK |
実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスを取得します。ネーミングサービスのオブジェクトリファレンスには、CORBAインタフェースのオブジェクトリファレンスの取り出しメソッドを使用します。処理の記述例を以下に示します。
*NamingServiceのObjectIDの設定 MOVE FUNCTION LENG ( CORBA-ORB-OBJECTID-NAMESERVICE ) TO STRING-LENGTH. CALL "CORBA-STRING-SET" USING TEMP-BUF STRING-LENGTH CORBA-ORB-OBJECTID-NAMESERVICE. *NamingServiceのオブジェクトリファレンス獲得 CALL "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" USING ORB TEMP-BUF ENV COS-NAMING. * NAMESERVICEIDに格納した領域を解放する CALL "CORBA-FREE" USING TEMP-BUF. MOVE "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" TO MESS. PERFORM ENV-CHECK. |
インタフェースリポジトリには、IDLで定義されたモジュール名、インタフェース名、オペレーション名、パラメタが階層構造で格納されています。インタフェースリポジトリからサーバアプリケーションの情報を獲得する方法について、以下に示します。
インタフェースリポジトリからサーバアプリケーションの情報を取得するためには、INTERFACEDEFオブジェクトのオブジェクトリファレンスが必要です。INTERFACEDEFオブジェクトのオブジェクトリファレンスを求めるには、オブジェクト名をパラメタとして、ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを求め、その後、OBJECT-GET-INTERFACEメソッドにより、INTERFACEDEFオブジェクトリファレンスを取得します。処理の記述例を以下に示します。
* オブジェクト名 MOVE FUNCTION LENG (STR-BUF) TO STRING-LENGTH. MOVE "ODdemo::calculator" TO STR-BUF. CALL "CORBA-STRING-SET" USING IDL-ID OF NAME-COMPONENT STRING-LENGTH STR-BUF. * オブジェクトのタイプ MOVE " " TO STR-BUF. CALL "CORBA-STRING-SET" USING KIND OF NAME-COMPONENT STRING-LENGTH STR-BUF. * オブジェクト名の数 MOVE 1 TO SEQ-LENGTH OF NAME. MOVE 1 TO SEQ-MAXIMUM OF NAME. * sequenceの要素数 MOVE 1 TO NUM. * CosNamingのアクセス情報格納用のsequence領域獲得 CALL "CORBA-SEQUENCE-COSNAMING-NAMECOMPONENT-ALLOCBUF" USING SEQ-MAXIMUM OF NAME SEQ-BUFFER OF NAME. MOVE FUNCTION ADDR ( NAME ) TO NAME-A. MOVE FUNCTION ADDR ( NAME-COMPONENT ) TO NAME-COMPONENT-A. * CoSNamingの要素設定 CALL "CORBA-SEQUENCE-ELEMENT-SET" USING NAME-A NUM NAME-COMPONENT-A. * サーバアプリケーションのオブジェクトリファレンスを獲得 CALL "COSNAMING-NAMINGCONTEXT-RESOLVE" USING COS-NAMING NAME ENV OBJ. MOVE "COSNAMING-NAMINGCONTEXT-RESOLVE" TO MESS. PERFORM ENV-CHECK. * サーバアプリケーションのinterfaceDefを獲得 * CALL "CORBA-OBJECT-GET-INTERFACE" USING OBJ ENV INTF-INTF. |
サーバアプリケーションのメソッド名をパラメタとして、CORBA-INTERACEDEF-LOOKUP-NAMEメソッドにより、指定されたメソッドをインタフェースリポジトリから検索します。このメソッドにより、指定したメソッド情報が格納されているOPERATIONDEFオブジェクトのオブジェクトリファレンスが通知されます。
処理の記述例を以下に示します。
* メソッド名の入力 DISPLAY " Please input method name==>". ACCEPT BUF. * オブジェクトリファレンスの取得 : Operation情報の取得 SET CORBA-DK-OPERATION OF DK-FLAG TO TRUE. MOVE -1 TO NUM. MOVE CORBA-FALSE TO BL. CALL "CORBA-INTERFACEDEF-LOOKUP-NAME" USING INTF-INTF BUF NUM DK-FLAG BL ENV INTF-OPR. |
OPERATIONDEFオブジェクトリファレンスをパラメタとして、CORBA-OPERATION-DESCRIBEメソッドにより、サーバアプリケーションが所持しているメソッドのパラメタの情報(パラメタの名前、個数、パラメタの型等)をインタフェースリポジトリから検索します。
* パラメタ情報の構造体の取得 MOVE 1 TO NUM. CALL "CORBA-SEQUENCE-ELEMENT-GET" USING INTF-OPR NUM WORK-POINTER. SET ADDRESS OF TMP-CONT TO WORK-POINTER. CALL "CORBA-OPERATIONDEF-DESCRIBE" USING TMP-CONT ENV DESCRIPTION. |
トランザクションを開始するために、Currentインタフェースのオブジェクトリファレンスを取得し、COSTRANSACTIONS-CURRENT-BEGINメソッドを呼び出します。処理の記述例を以下に示します。
MOVE FUNCTION LENG (CORBA-ORB-OBJECTID-TRANCURRENT) TO STRING-LENGTH. *トランザクション開始インタフェースのオブジェクトリファレンスを獲得 CALL "CORBA-STRING-SET" USING TEMP-BUF STRING-LENGTH CORBA-ORB-OBJECTID-TRANCURRENT. CALL "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" USING ORB TEMP-BUF ENV CURRENT-OBJ. *トランザクション開始 CALL "COSTRANSACTIONS-CURRENT-BEGIN" USING CURRENT-OBJ ENV MOVE "COSTRANSACTIONS-CURRENT-BEGIN" TO MESS. PERFORM ENV-CHECK. |
サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成するために、CORBA-ORB-CREATE-LISTメソッドに、何個のパラメタを格納するかを指定します。これにより、NVListオブジェクトリファレンスが通知されます。処理の記述例を以下に示します。
* Contained-Description構造体からパラメタ構造体の抽出 SET ADDRESS OF TMP-DESC TO DESCRIPTION. MOVE VALUE OF DESCRIPTION TO PARAM-ANY. * パラメタ情報の抽出 SET ADDRESS OF TMP-OPR-DESC TO ANY-VALUE OF PARAM-ANY. MOVE PARAMETERS OF TMP-OPR-DESC TO PARAMS. MOVE LENGTH OF PARAMS TO NUM. * リストオブジェクトの生成 CALL "CORBA-ORB-CREATE-LIST" USING ORB NUM ARG-LIST ENV RET-VAL. |
CORBA-NVLISTオブジェクトリファレンス、サーバアプリケーションのパラメタの名前、型、値および長さをパラメタとしてCORBA-NVLIST-ADD-ITEMメソッドにより、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。処理の記述例を以下に示します。
MOVE FUNCTION ADDR(PARAMS) TO SEQ-POINTER. MOVE "in_p" TO STR-BUF. MOVE FUNCTION LENG (STR-BUF) TO STRING-LENGTH. CALL "CORBA-STRING-SET" USING STRING-POINTER STRING-LENGTH STR-BUF. MOVE FUNCTION LENG (TC-LONG) TO STRING-LENGTH. CALL "CORBA-STRING-SET" USING TEMP-BUF STRING-LENGTH TC-LONG. CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING TEMP-BUF TMP-TYPE. CALL "CORBA-FREE" USING TEMP-BUF. MOVE 1234 TO IN-P. MOVE FUNCTION ADDR( IN-P ) TO PARAM-POINTER. MOVE LSIZE OF TMPDATA TO NUM. SET CORBA-ARG-IN OF FLAG TO TRUE. CALL "CORBA-NVLIST-ADD-ITEM" USING ARG-LIST STRING-POINTER TMP-TYPE PARAM-POINTER NUM FLAG ENV RET-VAL. |
CORBA-OBJECT-CREATE-REQUESTメソッドにより、リクエストオブジェクトを作成します。リクエストとは、メソッド名にパラメタを加えたものです。リクエストオブジェクトに対して、サーバオブジェクトのオブジェクトリファレンス、NVLISTオブジェクトリファレンス、後述するNAMEDVALUEと呼ぶサーバの処理結果を格納する領域を指定することによりリクエストオブジェクトのオブジェクトリファレンスが通知されます。処理の記述例を以下に示します。
MOVE FUNCTION ADDR(RESULT) TO PARAM-POINTER. MOVE "_set_attr" TO STR-BUF. MOVE FUNCTION LENG (STR-BUF) TO STRING-LENGTH. CALL "CORBA-STRING-SET" USING STRING-POINTER STRING-LENGTH STR-BUF. SET CORBA-OUT-LIST-MEMORY OF FLAG TO TRUE. CALL "CORBA-OBJECT-CREATE-REQUEST" USING OBJ CTX STRING-POINTER ARG-LIST PARAM-POINTER REQ FLAG ENV RET-VAL. |
NamedValueは、サーバの処理結果を格納するための領域です。定義例を以下に示します。
module CORBA { typedef string Identifier; enum Flags{ ARG_IN, ARG_OUT, ARG_INOUT, OUT_LIST_MEMORY, IN_COPY_VALUE, INV_NO_RESPONSE, INV_TERM_ON_ERR, RESP_NO_WAIT, DEPENDENT_LIST, CTX_RESTRICT_SCOPE, CTX_DELETE_DESCENDENTS }; struct NamedValue { Identifier name; // パラメタの名前 any argument; // パラメタの値 long len; // パラメタの長さ Flags arg_modes; // パラメタの引き渡し方法(in,out,inout) }; }; |
*NamedValue構造体 CORBA-NAMED-VALUE. * パラメタの名前 07 NAME USAGE POINTER. * パラメタの値 07 ARGUMENT. 09 ANY-TYPE USAGE POINTER. 09 ANY-VALUE USAGE POINTER. * パラメタの長さ 07 LEN PIC S9(9) COMP-5. *パラメタの引き渡し方法(in,out,inout) 07 ARG-MODES PIC 9(9) COMP-5. 88 CORBA-ARG-IN VALUE 1. 88 CORBA-ARG-OUT VALUE 2. 88 CORBA-ARG-INOUT VALUE 4. 88 CORBA-OUT-LIST-MEMORY VALUE 8. 88 CORBA-IN-COPY-VALUE VALUE 16. 88 CORBA-INV-NO-RESPONSE VALUE 32. 88 CORBA-INV-TERM-ON-ERR VALUE 64. 88 CORBA-RESP-NO-WAIT VALUE 128. 88 CORBA-DEPENDENT-LIST VALUE 256. 88 CORBA-CTX-RESTRICT-SCOPE VALUE 512. 88 CORBA-CTX-DELETE-DESCENDENTS VALUE 1024. |
サーバアプリケーションに対してリクエストを送信します。リクエストの方法として以下に示す方法があります。
それぞれについて、以下に示します。
リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA-REQUEST-INVOKEメソッドにより、サーバアプリケーションを呼び出します。処理の記述例を以下に示します。
MOVE 0 TO FLAG. CALL "CORBA-REQUEST-INVOKE" USING REQ FLAG ENV RET-VAL. |
リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA-REQUEST-SENDメソッドにより、サーバアプリケーションを呼び出します。サーバアプリケーションの処理結果は、CORBA-REQUEST-GET-RESPONCEメソッドにより受け取ります。処理の記述例を以下に示します。
* 処理の要求 SET CORBA-INV-NO-RESPONSE OF FLAG TO TRUE. CALL "CORBA-REQUEST-SEND" USING REQ FLAG ENV RET-VAL. * 処理結果の受け取り SET CORBA-RESP-NO-WAIT OF FLAG TO TRUE. CALL "CORBA-REQUEST-GET-RESPONSE" USING REQ FLAG ENV RET-VAL. IF RET-VAL = CORBA-TRUE * ユーザの処理 END-IF. |
リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA-REQUEST-DELETEメソッドにより、リクエストオブジェクトを削除します。処理の記述例を以下示します。
*リクエストオブジェクトの削除 CALL "CORBA-REQUEST-DELETE" USING REQ ENV RET-VAL. |
サーバアプリケーションのメソッド呼び出しの結果を復帰状態から判断し、トランザクションの状態を決定します。トランザクションを正常に終了させる場合には、COSTRANSACTIONS-CURRENT-COMMITメソッドを呼び出し、トランザクションをコミットさせます。トランザクションを異常で終了させる場合には、COSTRANSACTIONS-CURRENT-ROLLBACKメソッドを呼び出し、トランザクションをロールバックさせます。処理の記述例を以下に示します。
*サーバアプリケーションのメソッド呼び出しの復帰状態を確認 EVALUATE TRUE WHEN CORBA-NO-EXCEPTION OF MAJOR OF ENV MOVE CORBA-TRUE TO REPORT-HEURISTICS CALL "COSTRANSACTIONS-CURRENT-COMMIT" USING CURRENT-OBJ REPORT-HEURISTICS ENV WHEN CORBA-SYSTEM-EXCEPTION OF MAJOR OF ENV CALL "COSTRANSACTIONS-CURRENT-ROLLBACK" USING CURRENT-OBJ ENV. |
目次 索引 |