動的起動インタフェースを使用する場合の、クライアントアプリケーションの流れを以下に示します。
CORBAの初期化メソッドCORBA-ORB_INITを呼び出し初期化処理を行います。当メソッドの結果として、ORBのオブジェクトリファレンスが返されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。環境部(ENVIRONMENT DIVISION)およびデータ部(DATA DIVISION)を定義します。
ここでは、IDLファイル名を“simple.idl”として説明します。IDLコンパイラが出力する登録集ファイル名は、“simple--rep.cbl”, “simple--const.cbl”,“simple--copy.cbl”となります。
IDENTIFICATION DIVISION. PROGRAM-ID. "SIMPLE_C" * ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. * ObjectDirectorの標準登録集(リポジトリ宣言用) COPY CORBA--REP. * ネーミングサービスの標準登録集(リポジトリ宣言用) COPY COSNAMING--REP. * インタフェースリポジトリの標準登録集(リポジトリ宣言用) COPY INTERFACEREP--REP. * IDLコンパイラが出力した登録集(リポジトリ宣言用) COPY SIMPLE--REP. . SPECIAL-NAMES. SYMBOLIC CONSTANT * ObjectDirectorの標準登録集(定数宣言用) COPY CORBA--CONST. * ネーミングサービスの標準登録集(定数宣言用) COPY COSNAMING--CONST. * インタフェースリポジトリの標準登録集(定数宣言用) COPY INTERFACEREP--CONST. * IDLコンパイラが出力した登録集(定数宣言用) COPY SIMPLE--CONST. . * DATA DIVISION. WORKING-STORAGE SECTION. 01 APL-NAME PIC X(8) VALUE "Simple_c". 01 EXCEPTION-ID OBJECT REFERENCE CORBA-STRING. 01 EXCEPTION-ID-VALUE PIC X(50). 01 API-NAME PIC X(50). 01 ORB OBJECT REFERENCE CORBA-ORB. * PROCEDURE DIVISION. * DECLARATIVES. ERR SECTION. USE EXCEPTION CORBA-EXCEPTION. SET EXCEPTION-ID TO IDL-ID OF EXCEPTION-OBJECT AS CORBA-EXCEPTION. INVOKE EXCEPTION-ID "GET-VALUE" RETURNING EXCEPTION-ID-VALUE. DISPLAY API-NAME " is failed.". DISPLAY "Exception-id is " EXCEPTION-ID-VALUE. EXIT PROGRAM. END-ERR. END DECLARATIVES. * INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB.
例外処理については、“G.2.3 クライアントアプリケーションの例外処理”を参照してください。
実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスが必要となります。CORBAインタフェースのオブジェクトリファレンスの取出しメソッドCORBA-ORB-RESOLVE_INITIAL_REFERENCESによりネーミングサービスのオブジェクトリファレンスを取り出します。このとき、CORBA-ORB-OBJECTID_NAMESERVICE(値は“NameService”)をメソッドのパラメタとして指定します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 OBJ OBJECT REFERENCE CORBA-OBJECT. 01 NAMING-CONTEXT OBJECT REFERENCE COSNAMING-NAMINGCONTEXT. PROCEDURE DIVISION. INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-ORB-OBJECTID_NAMESERVICE RETURNING OBJ. * INVOKE COSNAMING-NAMINGCONTEXT "NARROW" USING OBJ RETURNING NAMING-CONTEXT.
ネーミングサービスCOSNAMING-NAMINGCONTEXT-RESOLVEメソッドにより、これから実行したいサーバアプリケーションのオブジェクトリファレンスを取り出します。検索したいオブジェクト名を本メソッドのパラメタとして指定します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 NAME TYPE COSNAMING-NAME. 01 NAME-COMPONENT OBJECT REFERENCE COSNAMING-NAMECOMPONENT. 01 NAME-ID OBJECT REFERENCE CORBA-STRING. 01 NAME-KIND OBJECT REFERENCE CORBA-STRING. 01 NAME-LEN TYPE CORBA-UNSIGNED-LONG. 01 NAME-ID-VALUE PIC X(18) VALUE "ODdemo::calculator". 01 NAME-KIND-VALUE PIC X(1) VALUE SPACE. PROCEDURE DIVISION. MOVE 1 TO NAME-LEN. INVOKE SEQUENCE-NAMECOMPONENT-001 "NEW-WITH-LENGTH" USING NAME-LEN RETURNING NAME. INVOKE COSNAMING-NAMECOMPONENT "NEW" RETURNING NAME-COMPONENT. INVOKE CORBA-STRING "NEW-WITH-VALUE" USING NAME-ID-VALUE *> オブジェクト名 RETURNING NAME-ID. INVOKE CORBA-STRING "NEW-WITH-VALUE" USING NAME-KIND-VALUE *> オブジェクトタイプ RETURNING NAME-KIND. SET IDL-ID OF NAME-COMPONENT TO NAME-ID. SET KIND OF NAME-COMPONENT TO NAME-KIND. INVOKE NAME "SET-VALUE" USING NAME-LEN NAME-COMPONENT. INVOKE NAME "SET-VALUE" USING NAME-LEN NAME-COMPONENT. * NamingServiceのresolveメソッドを発行 INVOKE NAMING-CONTEXT "RESOLVE" USING NAME RETURNING OBJ.
インタフェースリポジトリには、IDLで定義されたモジュール名、インタフェース名、オペレーション名およびパラメタが階層構造で格納されます。サーバアプリケーションの情報を獲得するため、以下の手順で検索を行います。
(1)CORBA-INTERFACEDEFオブジェクトリファレンスの獲得
インタフェースリポジトリからサーバアプリケーションの情報を獲得するためには、INTERFACEDEFオブジェクトのオブジェクトリファレンスが必要です。CORBA-OBJECT-GET_INTERFACE_DEFメソッドを使用します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 INTF-OBJ OBJECT REFERENCE CORBA-OBJECT. 01 INTF OBJECT REFERENCE CORBA-INTERFACEDEF. PROCEDURE DIVISION. * CORBA-INTERFACEDEFオブジェクトリファレンス取得 INVOKE OBJ "GET_INTERFACE_DEF" RETURNING INTF-OBJ. INVOKE CORBA-INTERFACEDEF "NARROW" USING INTF-OBJ RETURNING INTF.
(2)SEQUENCE-CORBA-CONTAINEDオブジェクトリファレンスの獲得
CORBA-INTERFACEDEF-LOOKUP_NAMEメソッドにより、サーバアプリケーションが複数もっているメソッドから指定されたメソッドをインタフェースリポジトリから検索します。パラメタとしてサーバアプリケーションのメソッド名を指定します。結果として、指定したメソッド情報が格納されているSEQUENCE-CORBA-CONTAINEDオブジェクトのオブジェクトリファレンスが返されます。
DATA DIVISION. WORKING-STORAGE SECTION. 01 DK-TYPE TYPE CORBA-DEFINITIONKIND. 01 CTD-SEQ OBJECT REFERENCE SEQUENCE-CORBA-CONTAINED. PROCEDURE DIVISION. * SEQUENCE-CORBA-CONTAINEDオブジェクトリファレンス取得 SET CORBA-DK_OPERATION OF DK-TYPE TO TRUE. INVOKE INTF "LOOKUP_NAME" USING "calculate" -1 DK-TYPE CORBA-FALSE RETURNING CTD-SEQ.
(3)パラメタ情報の獲得
CORBA-CONTAINED-DESCRIBEメソッドにより、サーバアプリケーションがもっているメソッドのパラメタの情報(パラメタの名前、個数、パラメタの型等)をインタフェースリポジトリから検索します。パラメタとして、CORBA-CONTAINED-DESCRIPTIONオブジェクトリファレンスを指定します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 TMP-CTD OBJECT REFERENCE CORBA-CONTAINED. 01 CTD-DES OBJECT REFERENCE CORBA-CONTAINED-DESCRIPTION. PROCEDURE DIVISION. * 指定されたメソッドのパラメタ情報を検索 INVOKE CTD-SEQ "GET-VALUE" USING 1 RETURNING TMP-CTD. INVOKE TMP-CTD "DESCRIBE" RETURNING CTD-DES.
(1)パラメタリストの生成
CORBA-ORB-CREATE_LISTメソッドにより、サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、何個のパラメタを格納するかを指定します。結果として、NVListオブジェクトリファレンスが通知されます。NVListオブジェクトインタフェースの詳細については、“NVListオブジェクト”を参照してください。
DATA DIVISION. WORKING-STORAGE SECTION. 01 OPE-ANY OBJECT REFERENCE CORBA-ANY. 01 OPE-DES OBJECT REFERENCE CORBA-OPERATIONDESCRIPTION. 01 PARA-SEQ TYPE CORBA-PARDESCRIPTIONSEQ. 01 PARAM-COUNT TYPE CORBA-LONG. 01 NVLIST OBJECT REFERENCE CORBA-NVLIST. PROCEDURE DIVISION. * CORBA-CONTAINED-DESCRIPTION構造体からパラメタ情報構造体の抽出 SET OPE-ANY TO IDL-VALUE OF CTD-DES. INVOKE CORBA-OPERATIONDESCRIPTION--H "EXTRACT" USING OPE-ANY RETURNING OPE-DES. * パラメタ情報の抽出 SET PARA-SEQ TO PARAMETERS OF OPE-DES. MOVE SEQ-LENGTH OF PARA-SEQ TO PARAM-COUNT. * リストオブジェクトの生成 INVOKE ORB "CREATE_LIST" USING PARAM-COUNT NVLIST.
(2)パラメタリストの設定
CORBA-NVLIST-ADD_VALUEメソッドにより、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタとして、サーバアプリケーションのパラメタの名前、値(Any型)およびパラメタの形式を設定します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 PARA-DES1 OBJECT REFERENCE CORBA-PARAMETERDESCRIPTION. 01 PARA-DES2 OBJECT REFERENCE CORBA-PARAMETERDESCRIPTION. 01 STR-1 OBJECT REFERENCE CORBA-STRING. 01 NAME1 PIC X(40). 01 STR-2 OBJECT REFERENCE CORBA-STRING. 01 NAME2 PIC X(40). 01 ANY-A OBJECT REFERENCE CORBA-ANY. 01 ANY-B OBJECT REFERENCE CORBA-ANY. 01 TMP-NAMEDVALUE OBJECT REFERENCE CORBA-NAMEDVALUE. 01 FLG TYPE CORBA-FLAGS. PROCEDURE DIVISION. * PARAMERTER 1 INVOKE PARA-SEQ "GET-VALUE" USING 1 RETURNING PARA-DES1 SET STR-1 TO NAME OF PARA-DES1. INVOKE STR-1 "GET-VALUE" RETURNING NAME1. INVOKE CORBA-ANY "NEW" RETURNING ANY-A. INVOKE ANY-A "INSERT_LONG" USING 100. SET CORBA-ARG_IN OF FLG TO TRUE. INVOKE NVLIST "ADD_VALUE" USING NAME1 ANY-A FLG RETURNING TMP-NAMEDVALUE. * PARAMETER 2 INVOKE PARA-SEQ "GET-VALUE" USING 2 RETURNING PARA-DES2 SET STR-2 TO NAME OF PARA-DES2. INVOKE STR-2 "GET-VALUE" RETURNING NAME2. INVOKE CORBA-ANY "NEW" RETURNING ANY-B. INVOKE ANY-B "INSERT_LONG" USING 20. SET CORBA-ARG_IN OF FLG TO TRUE. INVOKE NVLIST "ADD_VALUE" USING NAME2 ANY-B FLG RETURNING TMP-NAMEDVALUE.
CORBA-OBJECT-CREATE_REQUESTメソッドにより、リクエストオブジェクトを作成します。リクエストオブジェクトに対して、サーバオブジェクトのオブジェクトリファレンス、NVListオブジェクトリファレンス、後述するNamedValueと呼ぶサーバの処理結果を格納する領域を指定します。結果として、リクエストオブジェクトが返されます。
DATA DIVISION. WORKING-STORAGE SECTION. 01 RESULT-TYPE OBJECT REFERENCE CORBA-TYPECODE. 01 ANY-RESULT OBJECT REFERENCE CORBA-ANY. 01 NAMEDVALUE OBJECT REFERENCE CORBA-NAMEDVALUE. 01 EXCEPTIONLIST OBJECT REFERENCE CORBA-EXCEPTIONLIST. 01 TMP-EXCEP TYPE CORBA-EXCDESCRIPTIONSEQ. 01 EX-DES OBJECT REFERENCE CORBA-EXCEPTIONDESCRIPTION. 01 EX-TYPE OBJECT REFERENCE CORBA-TYPECODE. 01 REQ OBJECT REFERENCE CORBA-REQUEST. PROCEDURE DIVISION. * 復帰パラメタ SET RESULT-TYPE TO RESULT OF OPE-DES. INVOKE CORBA-ANY "NEW" RETURNING ANY-RESULT INVOKE ANY-RESULT "SET-TYPE" USING RESULT-TYPE. SET CORBA-ARG_OUT OF FLG TO TRUE. * 復帰パラメタ格納域 INVOKE ORB "CREATE_NAMED_VALUE" USING " " ANY-RESULT FLG RETURNING NAMEDVALUE. * EXCEPTIONLIST INVOKE ORB "CREATE_EXCEPTION_LIST" USING EXCEPTIONLIST. SET TMP-EXCEP TO EXCEPTIONS OF OPE-DES. INVOKE TMP-EXCEP "GET-VALUE" USING 1 RETURNING EX-DES. SET EX-TYPE TO IDL-TYPE OF EX-DES. INVOKE EXCEPTIONLIST "ADD" USING EX-TYPE. * リクエストオブジェクトの生成 INVOKE OBJ "CREATE_REQUEST" USING NULL *>CONTEXT "calculate" *>メソッド名 NVLIST *>入力パラメタ NAMEDVALUE *>復帰値 EXCEPTIONLIST *>EXCEPTIONLIST NULL *>CONTEXTLIST REQ. *>リクエスト
サーバアプリケーションに対してリクエストを出します。リクエストの方法として、同期送信と非同期送信の2つの方法があります。
(1)同期送信
CORBA-REQUEST-INVOKEメソッドにより、サーバアプリケーションを呼び出します。
INVOKE REQ "INVOKE".
(2)非同期送信
CORBA-REQUEST-SEND_DEFERREDメソッドにより、サーバアプリケーションを呼び出します。サーバアプリケーションの処理結果は、CORBA-REQUEST-GET_RESPONSEメソッドにより受け取ります。
* 処理の要求 INVOKE REQ "SEND_DEFERRED". * 処理結果の受取り INVOKE REQ "GET_RESPONSE".
CORBA-REQUEST-GET_RESPONSEサーバアプリケーションからリクエストが完了していないことが判明した場合、再度CORBA-REQUEST-GET_RESPONSEメソッドを呼び出します。