ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)

G.2.2 クライアントアプリケーションのプログラミング(動的起動インタフェース)

  動的起動インタフェースを使用する場合の、クライアントアプリケーションの流れを以下に示します。



G.2.2.1 初期化

  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 クライアントアプリケーションの例外処理”を参照してください。


G.2.2.2 ネーミングサービスのオブジェクトリファレンスの獲得

  実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスが必要となります。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.

G.2.2.3 サーバアプリケーションのオブジェクトリファレンスの獲得

  ネーミングサービス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.

G.2.2.4 インタフェースリポジトリからサーバアプリケーション情報の獲得

  インタフェースリポジトリには、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.

G.2.2.5 パラメタの組立て

(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.

G.2.2.6 リクエストの作成

  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.          *>リクエスト

G.2.2.7 リクエストの送信

  サーバアプリケーションに対してリクエストを出します。リクエストの方法として、同期送信と非同期送信の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メソッドを呼び出します。