Apdesigner プログラマーズガイド |
目次 索引 |
第2部 アプリケーション開発編 | > 第9章 CORBAクライアントアプリケーションを開発する | > 9.2 開発の流れ |
一般的なクライアントプログラムの記述内容を、以下に示します。
クライアントプログラムの処理順
ここでは、コンソールから入力したパラメタ2個をサーバプログラムに渡し、その結果をコンソールに表示するプログラムの例を示しながら、説明します。
サーバ側のアプリケーションを以下に示します。
パラメタを2個受け取り、その加算結果を復帰値として返却するサーバアプリケーションです。ネーミングサービス名は、「Sample::POAintf」で登録されているものとします。
// モジュール宣言 module SAMPLE { // ユーザインタフェース宣言 interface CALCULATE_ADD { long CALCULATE(in long param1,in long param2); }; };
静的起動インタフェースを使用した場合のオブジェクト指向COBOLプログラム作成上のポイントを、プログラム記述例を使用して説明します。
以下のようにCONFIGURATION SECTIONを記述します。
ORBの初期化で使用する変数をWORKING-STORAGE SECTIONで定義します。
以下のような変数を宣言します。
以下の処理を記述します。これらの処理は、テンプレートより入力できます。
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プログラムの記述例を示します。個々の処理記述は異なりますが、処理の流れなどはOOCOBOLの場合と同じです。環境部(ENVIRONMENT DIVISION)、データ部(DATA DIVISION)、個々の処理の詳細については、"Interstage Application Serverアプリケーション作成ガイド(CORBAサービス編)"を参照してください。
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.
目次 索引 |