静的起動インタフェースでサーバアプリケーションを呼び出す場合の例について説明します。
■初期化
初期化処理として、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