Apdesigner プログラマーズガイド
目次 索引 前ページ次ページ

第2部 アプリケーション開発編> 第9章 CORBAクライアントアプリケーションを開発する> 9.2 開発の流れ

9.2.3 CORBAクライアントプログラムを記述する

一般的なクライアントプログラムの記述内容を、以下に示します。

クライアントプログラムの処理順

ここでは、コンソールから入力したパラメタ2個をサーバプログラムに渡し、その結果をコンソールに表示するプログラムの例を示しながら、説明します。

+対象となるサーバアプリケーショ

サーバ側のアプリケーションを以下に示します。

++IDLファイル

パラメタを2個受け取り、その加算結果を復帰値として返却するサーバアプリケーションです。ネーミングサービス名は、「Sample::POAintf」で登録されているものとします。

// モジュール宣言
module SAMPLE { 
   // ユーザインタフェース宣言
   interface CALCULATE_ADD {
           long CALCULATE(in long param1,in long param2);
   };
};

+オブジェクト指向COBOLプログラム(静的起動)でのプログラム記述例

静的起動インタフェースを使用した場合のオブジェクト指向COBOLプログラム作成上のポイントを、プログラム記述例を使用して説明します。

++プログラム作成上のポイント

以下のようにCONFIGURATION SECTIONを記述します。

ORBの初期化で使用する変数をWORKING-STORAGE SECTIONで定義します。

以下のような変数を宣言します。

以下の処理を記述します。これらの処理は、テンプレートより入力できます。

++プログラム記述例

[メインプログラム:CALCULATE_ADD_CLIENT.cob]

 IDENTIFICATION DIVISION.
 PROGRAM-ID. MAIN.
 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.

   REPOSITORY.
* ObjectDirectorの標準登録集(リポジトリ宣言用)
     COPY CORBA--REP.
* ネーミングサービスの標準登録集(リポジトリ宣言用)
     COPY CosNaming--REP.
* IDLコンパイラが出力した登録集(リポジトリ宣言用)
     COPY USCALCULATE_ADD--REP.
* Apworksが提供しているCORBAクライアント開発用クラス
     CLASS CDCORBA.

  SPECIAL-NAMES.
     ARGUMENT-NUMBER IS 引数番号
     ARGUMENT-VALUE  IS 引数内容
     SYMBOLIC CONSTANT
* ObjectDirectorの標準登録集(定数宣言用)
     COPY CORBA--CONST.
* ネーミングサービスの標準登録集(定数宣言用)
     COPY COSNAMING--CONST.
* IDLコンパイラが出力した登録集(定数宣言用)
     COPY USCALCULATE_ADD--CONST.
     .
     
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01  L-APL-NAME PIC X(50) VALUE "CALCULATE_ADD_CLIENT".
 01 W-OBJECT OBJECT REFERENCE CORBA-OBJECT.
 01 W-TARGET  OBJECT REFERENCE SAMPLE-CALCULATE_ADD.

 01 W-PARAM1 PIC S9(9) COMP-5.
 01 W-PARAM2 PIC S9(9) COMP-5.
 01 W-RETURN PIC S9(9) COMP-5.
 01  L-RETURN PIC S9(9) COMP-5.
 01  L-NAME PIC X(128) VALUE "SAMPLE::CALCULATE_ADD".

 PROCEDURE DIVISION.
*    ORB初期化
     INVOKE CDCORBA "GET-ORB" USING L-APL-NAME RETURNING L-RETURN.
     IF L-RETURN NOT = 0 
     THEN
        DISPLAY "ERROR OCCURRED AT GET-ORB"
     END-IF
*    ネーミングサービス初期化
     INVOKE CDCORBA "GET-COSNAMING" RETURNING L-RETURN.
     IF L-RETURN NOT = 0
     THEN
        DISPLAY "ERROR OCCURRED AT GET-COSNAMING"
     END-IF

     INVOKE CDCORBA "GET-NAMEOBJ" USING L-NAME RETURNING L-RETURN.
     IF L-RETURN NOT = 0 
     THEN
        DISPLAY "ERROR OCCURRED AT GET-NAMEOBJ"
     END-IF

*    サーバオブジェクトの取得
     SET W-OBJECT TO NULL.
     INVOKE CDCORBA "GET-NAMEOBJR" RETURNING W-OBJECT.
     IF W-OBJECT = NULL
     THEN
        DISPLAY "ERROR OCCURRED AT GET-NAMEOBJR"
     END-IF

*    ターゲットオブジェクト取得
     SET W-TARGET TO NULL.
     INVOKE SAMPLE-CALCULATE_ADD "NARROW" USING W-OBJECT RETURNING W-TARGET.
     IF W-TARGET = NULL
     THEN
        DISPLAY "ERROR OCCURRED AT NARROW"
     END-IF
     
*    サーバアプリケーションのメソッドの呼出し
     DISPLAY "第一引数を入力してください:" WITH NO ADVANCING.
     ACCEPT  W-PARAM1.
     DISPLAY "第二引数を入力してください:" WITH NO ADVANCING.
     ACCEPT  W-PARAM2.

     INVOKE W-TARGET "CALCULATE" USING W-PARAM1 W-PARAM2 RETURNING W-RETURN.

     DISPLAY "加算結果:" W-RETURN.

*    実行を終了します。
     EXIT PROGRAM. 
 END PROGRAM MAIN.

+COBOLプログラム(静的起動)でのプログラム記述例

静的起動インタフェースを使用した場合のCOBOLプログラムの記述例を示します。個々の処理記述は異なりますが、処理の流れなどはOOCOBOLの場合と同じです。環境部(ENVIRONMENT DIVISION)、データ部(DATA DIVISION)、個々の処理の詳細については、"Interstage Application Serverアプリケーション作成ガイド(CORBAサービス編)"を参照してください。

++プログラム記述例

[メインプログラム:CALCULATE_ADD_COBCLIENT.cob]

 IDENTIFICATION DIVISION.
 PROGRAM-ID. MAIN.
 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.
* 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(30) VALUE "CALCULATE_ADD_CLIENT".
 01 TMP-STRING-BUF PIC X(20).
 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY ARG-COUNT.

* 文字列長
 01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY STRING-LENGTH.

* 作業ポインタ
 01 TEMP-BUF POINTER.

* CORBA-ENVIRONMENT
 01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV.

* CORBA-ORB
 01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB.

* CORBA-BOA
 01 COPY BOA IN CORBA REPLACING CORBA-BOA BY BOA.

* CORBA-OBJECT(各作業用)
 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ.

* 例外発生時の例外ID
 01 MESS PIC X(30).

* Naming Serviceリポジトリ
 01 COPY COSNAMING-NAMINGCONTEXT IN CORBA REPLACING
         COSNAMING-NAMINGCONTEXT BY COS-NAMING.

* ネーミングサービス名
 01 STR-BUF PIC X(30).

* そのほかネーミングコンテキスト操作用
 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 LONG IN CORBA REPLACING CORBA-LONG BY NUM.

* メソッドの復帰値
 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY RET.
* メソッドのパラメタ
 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARAM1.
 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARAM2.
 
 PROCEDURE DIVISION.
* サーバアプリ起動パラメタの設定
* 起動パラメタの最初には、クライアントアプリケーション名を設定
     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.
     
*
*    ORBの初期化
*    (CORBA-ORB-INIT,CORBA-ORB-BOA-INIT)
*
     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.
     CALL "CORBA-FREE" USING TEMP-BUF.
     PERFORM ENV-CHECK.

     MOVE 15 TO STRING-LENGTH.
     CALL       "CORBA-STRING-SET" USING
           TEMP-BUF
           STRING-LENGTH
           CORBA-BOA-OA-ID.
     CALL "CORBA-ORB-BOA-INIT" USING
           ORB
           CURRENT-ARG-C
           CURRENT-ARG-V
           TEMP-BUF
           ENV
           BOA.
     CALL "CORBA-FREE" USING TEMP-BUF.
     PERFORM ENV-CHECK.

*
*    Naming Serviceのリポジトリの獲得
*
     MOVE FUNCTION LENG ( CORBA-ORB-OBJECTID-NAMESERVICE ) TO STRING-LENGTH.
     CALL "CORBA-STRING-SET" USING
           TEMP-BUF
           STRING-LENGTH
           CORBA-ORB-OBJECTID-NAMESERVICE.
     CALL "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" USING
           ORB
           TEMP-BUF
           ENV
           COS-NAMING.
     CALL "CORBA-FREE" USING TEMP-BUF.
     PERFORM ENV-CHECK.

*
*    サーバアプリケーションを検索
*
     MOVE FUNCTION LENG (STR-BUF) TO STRING-LENGTH.
     MOVE "SAMPLE::CALCULATE_ADD" 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.
     MOVE 1 TO NUM.
     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.
     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.

*
*    サーバオブジェクトの呼出し
*    サンプル名-インタフェース名-オペレータ名
*

*    加算
     DISPLAY "第一引数を入力してください:" WITH NO ADVANCING.
     ACCEPT  PARAM1.
     DISPLAY "第二引数を入力してください:" WITH NO ADVANCING.
     ACCEPT  PARAM2.

     CALL "SAMPLE-CALCULATE-ADD-CALCULATE" USING
          OBJ
          PARAM1
          PARAM2
          ENV
          RET.
     PERFORM ENV-CHECK.
     
     DISPLAY "加算結果:" RET.
*
*    後処理
*

     CALL "CORBA-OBJECT-RELEASE" USING OBJ ENV.
     CALL "CORBA-OBJECT-RELEASE" USING COS-NAMING ENV.
     PERFORM ENV-CHECK.
     CALL "CORBA-FREE" USING SEQ-BUFFER OF NAME.
*
* CORBA-ENVIRONMENTの情報を参照して例外が発生しているかどうか
* チェック
*
 ENV-CHECK SECTION.
     EVALUATE TRUE
         WHEN CORBA-NO-EXCEPTION OF MAJOR OF ENV
              CONTINUE
         WHEN CORBA-USER-EXCEPTION OF MAJOR OF ENV
              DISPLAY "USER-EXCEPTION   : " 
              MOVE FUNCTION LENG (MESS) TO STRING-LENGTH
              CALL "CORBA-STRING-GET" USING
                                  IDL-ID OF ENV
                                  STRING-LENGTH
                                  MESS
              DISPLAY "ID : " MESS
              EXIT PROGRAM
         WHEN CORBA-SYSTEM-EXCEPTION OF MAJOR OF ENV
              DISPLAY "SYSTEM-EXCEPTION : " 
              MOVE FUNCTION LENG (MESS) TO STRING-LENGTH
              CALL "CORBA-STRING-GET" USING
                                  IDL-ID OF ENV
                                  STRING-LENGTH
                                  MESS
              DISPLAY "ID : " MESS
              EXIT PROGRAM
     END-EVALUATE.
 ENV-CHECK-END.
     EXIT.

 END PROGRAM MAIN.

目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 1998-2006