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

3.3.2 ソースの作成

3.3.2.1 アプリケーションの構成

  グローバルトランザクション運用を行うためには、CORBAのクライアントアプリケーションの処理に加えて、COSTRANSACTIONS-CURRENT-COMMITメソッドなどのCurrentインタフェースを呼び出して、データベース連携サービスにトランザクション処理を依頼します。
  これらの処理を考慮したクライアントアプリケーションの構成について以下に示します。



初期化処理部

  クライアントアプリケーションをCORBAサービスに登録、およびトランザクションサービスの初期化を行います。


アプリケーション固有部

  アプリケーション固有の処理部です。トランザクションの開始から終了までの流れを記述します。


トランザクション用ライブラリ

  データベース連携サービスが提供するクライアントアプリケーション用ライブラリです。


  クライアントアプリケーションの基本形を以下に示します。

MAIN.
* 初期化処理
        :
     CALL "CORBA-ORB-INIT" USING
        CURRENT-ARG-C
        CURRENT-ARG-V
        TRANSACTIONCURRENTID
        ENV
        ORB.
        :
* サーバアプリケーションのオブジェクトリファレンス獲得
     CALL "COSNAMING-NAMINGCONTEXT-RESOLVE" USING              … (1)
        COS-NAMING
        NAME
        ENV
        OBJ.
        :
* トランザクション依頼処理
      MOVE FUNCTION LENG (CORBA-ORB-OBJECTID-TRANCURRENT) TO STRING-LENGTH.
      CALL  "CORBA-STRING-SET" USING
         TRANSACTIONCURRENTID
         STRING-LENGTH
         CORBA-ORB-OBJECTID-TRANCURRENT.
      CALL  "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" USING       … (2)
         ORB
         TRANSACTIONCURRENTID
         ENV
         TRANCURRENTOBJ.

* トランザクション開始
      CALL  "COSTRANSACTIONS-CURRENT-BEGIN" USING              … (3)
         TRANCURRENTOBJ
         ENV.
* サーバアプリケーションのメソッド呼出し
          :
      CALL  "MOD-INTF-OPE1"  USING                             … (4)
         OBJ
         PARA
         ENV.
         :

* トランザクション完了処理
      EVALUATE TRUE
      WHEN CORBA-NO-EXCEPTION OF MAJOR OF ENV
      CALL "COSTRANSACTION-CURRENT-COMMIT" USING               … (5)
          TRANCURRENTOBJ
          CORBA-TRUE
          ENV.
      WHEN CORBA-SYSTEM-EXCEPTION OF MAJOR OF ENV
      CALL "COSTRANSACTION-CURRENT-ROLLBACK" USING             
          TRANCURRENTOBJ
          ENV.

  1. ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを獲得します。

  2. Currentインタフェースのオブジェクトリファレンスを獲得します。

  3. COSTRANSACTIONS-CURRENT-BEGINメソッドでトランザクションの開始を宣言します。

  4. サーバアプリケーションを呼び出します。

  5. サーバアプリケーションの復帰状態を確認して、トランザクションの状態を決定します。トランザクションを正常終了する場合は、COSTRANSACTIONS-CURRENT-COMMITメソッドでトランザクションをコミットします。トランザクションを異常終了する場合は、COSTRANSACTIONS-CURRENT-ROLLBACKメソッドでトランザクションをロールバックします。


3.3.2.2 形態の説明

  クライアントアプリケーションからサーバアプリケーションを呼び出す形態を以下に示します。


同期型

  サーバアプリケーションを呼び出し、サーバアプリケーションのメソッドが終了した時点でクライアントアプリケーションに制御が戻ります。

非同期型

  サーバアプリケーションを呼び出し、サーバアプリケーションのメソッドの終了を待たずにクライアントアプリケーションに制御が戻ります。クライアントアプリケーションは、任意のタイミングでサーバアプリケーションのメソッドの終了を問い合わせます。


同期型


呼出し形態

  同期型呼出しは、クライアントアプリケーションからサーバアプリケーションを呼び出し、そのサーバアプリケーションの処理終了を待ち合わせる呼出し形態です。
  同期型の呼出し形態について、以下に示します。



インタフェース

  同期型には、以下の2つのインタフェースがあります。詳細については、“リファレンスマニュアル(API編)”を参照してください。

  • 静的起動インタフェース
      サーバアプリケーションのメソッド名を指定して呼び出します。

  • 動的起動インタフェース
      Requestインタフェースのinvokeメソッドでサーバアプリケーションを呼び出します。

  動的起動インタフェースにおいて、遅延同期送信を行う場合の注意事項を以下に示します。


遅延同期送信の呼出し

  遅延同期送信の呼出し元は、その呼出しの復帰が完了するまでデータベースの操作を禁止します。



遅延同期送信で呼び出されたサーバ

  遅延同期送信の呼出し先は、データベースを使用する場合は、複数の呼出しが同じデータベースをアクセスできません。


同一データベースへのアクセス

  遅延同期送信で呼び出されたアプリケーションから、同時に同一のデータベースを操作することはできません。



異なるデータベースへのアクセス

  遅延同期送信で呼び出されたアプリケーションから、異なるデータベースを操作することができます。



アプリケーションの処理論理

  同期型を使用する場合のクライアントアプリケーションの処理論理を以下に示します。



  1. サーバアプリケーションAのメソッド1を呼び出します。クライアントアプリケーションは、サーバアプリケーションAのメソッドが終了するまで待ち合わせます。

  2. クライアントアプリケーションは、サーバアプリケーションAのメソッド1の処理が終了した時点で制御が戻ります。

  3. サーバアプリケーションBのメソッド2を呼び出します。クライアントアプリケーションは、サーバアプリケーションBのメソッドが終了するまで待ち合わせます。

  4. クライアントアプリケーションは、サーバアプリケーションBのメソッド2の処理が終了した時点で制御が戻ります。


非同期型


呼出し形態

  非同期型呼出しは、クライアントアプリケーションからサーバアプリケーションを呼び出し、サーバアプリケーションのメソッドの終了を待たずにクライアントアプリケーションに制御が戻ります。クライアントアプリケーションは任意のタイミングでサーバアプリケーションのメソッドの終了結果を問い合わせる呼出し形態です。
  非同期型の呼出し形態を以下に示します。



インタフェース

  Requestインタフェースを使用します。詳細については、“リファレンスマニュアル(API編)”を参照してください。


アプリケーションの処理論理

  非同期型を使用する場合のクライアントアプリケーションの処理論理を以下に示します。



  1. サーバアプリケーションAのメソッド1を非同期型で呼び出します。

  2. サーバアプリケーションBのメソッド2を非同期型で呼び出します。

  3. メソッド1の処理終了を問い合わせます。

  4. メソッド2の処理終了を問い合わせます。


3.3.2.3 静的起動インタフェース

  静的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。


初期化

  初期化処理として、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 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM.
 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARAM1.
 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARAM2.
 01 A-RESULT. 
    02 COPY LONG IN CORBA REPLACING CORBA-LONG BY ADD-RESULT. 
    02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SUBTRACT-RESULT. 
    02 COPY LONG IN CORBA REPLACING CORBA-LONG BY MULTIPLE-RESULT. 
    02 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY DEVIDE-RESULT. 
 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 OBJECT IN CORBA REPLACING CORBA-OBJECT 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.

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

  ネーミングサービスから、実行したいサーバアプリケーションの情報を検索します。サーバアプリケーションの情報を取り出すには、実行したいサーバアプリケーションのオブジェクト名をパラメタとしてメソッドを起動し、オブジェクトリファレンス情報が格納されているネーミングコンテキストを取得します。
  処理の記述例を以下に示します。


* オブジェクト名
     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.

トランザクションの開始

  トランザクションを開始するために、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.

サーバオブジェクトのメソッド起動

  メソッド名はIDLで指定したモジュール名、インタフェース名、およびオペレーション名をハイフン(-)でつなげた形式で指定します。この例では、ODDEMO、CALCULATOR、およびCALCULATEが該当します。なお、メソッド呼出し時に、ネーミングサービスから取得したサーバアプリケーションのオブジェクトリファレンスとサーバプログラムで例外が発生した場合、例外情報を獲得するためにCORBA-ENVIRONMENT構造体を指定します。
  処理の記述例を以下に示します。


MOVE 100 TO PARAM1.
MOVE  20 TO PARAM2.

CALL "ODDEMO-CALCULATOR-CALCULATE" USING
    OBJ
    PARAM1
    PARAM2
    ENV
    A-RESULT.
MOVE "ODDEMO-CALCULATOR-CALCULATE" TO MESS.
PERFORM ENV-CHECK.

トランザクションの完了

  サーバアプリケーションのメソッド呼出しの結果を復帰状態から判断し、トランザクションの状態を決定します。トランザクションを正常終了する場合は、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

3.3.2.4 動的起動インタフェース

  動的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。


初期化

  初期化処理として、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で定義されたモジュール名、インタフェース名、オペレーション名、パラメタが階層構造で格納されています。
  インタフェースリポジトリからサーバアプリケーションの情報を獲得する方法について、以下に示します。


(1) InterfaceDefオブジェクトリファレンスの獲得

  インタフェースリポジトリからサーバアプリケーションの情報を取得するためには、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.

(2) OperationDefオブジェクトリファレンスの取得

  サーバアプリケーションのメソッド名をパラメタとして、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.

(3)パラメタ情報の取得

  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.

パラメタの組み立て

(1) パラメタリストの生成

  サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成するために、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.

(2) パラメタリストの設定

  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は、サーバの処理結果を格納するための領域です。
  定義例を以下に示します。


IDLファイルの定義例
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.