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

G.4.5 OOCOBOLの開発


動的スケルトンインタフェース(DSI)のサーバアプリケーションは、初期化処理部とサーバアプリケーションが実装するゲートウェイから構成されます。
初期化処理部では、以下に示す処理を行います。


image


G.4.5.1 初期化

CORBAの初期化メソッドCORBA-ORB_INITを呼び出して初期化処理を行います。本関数の結果として、ORBのオブジェクトリファレンスが通知されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。

 IDENTIFICATION DIVISION. 
 PROGRAM-ID. "SERVER-MAIN".
*
 ENVIRONMENT DIVISION. 
 CONFIGURATION SECTION. 
 REPOSITORY. 
     COPY CORBA--REP. 
     COPY SIMPLE--REP. 
     CLASS ODDEMO-CALCULATOR-IMPL. 
     . 
 SPECIAL-NAMES. 
     SYMBOLIC CONSTANT
     COPY CORBA--CONST. 
     COPY SIMPLE--CONST. 
     . 
*
 DATA DIVISION. 
 WORKING-STORAGE SECTION. 
 COPY CORBA--COPY. 
 COPY SIMPLE--COPY. 
 01  API-NAME        PIC   X(50). 
 01  APL-NAME        PIC   X(8)   VALUE     "Simple_s".
 01  ORB             USAGE OBJECT REFERENCE CORBA-ORB. 
 01  BOA             USAGE OBJECT REFERENCE CORBA-BOA. 
 01  IMPL-REP        USAGE OBJECT REFERENCE FJ-IMPLEMENTATIONREP. 
 01  IMPL            USAGE OBJECT REFERENCE CORBA-IMPLEMENTATIONDEF. 
 01  REP-ID          PIC   X(25)  VALUE     "IDL:ODdemo/calculator:1.0".
 01  OBJ             USAGE OBJECT REFERENCE CORBA-OBJECT. 
 01  EXCEPT-ID       USAGE OBJECT REFERENCE CORBA-STRING. 
 01  EXCEPT-ID-VALUE PIC   X(50). 
 01  L-DSIBASE       USAGE OBJECT REFERENCE DSIBASE. 
*
 PROCEDURE DIVISION. 
*
 DECLARATIVES. 
 ERR SECTION. 
     USE EXCEPTION CORBA-EXCEPTION. 
     SET EXCEPT-ID TO IDL-ID OF EXCEPTION-OBJECT AS CORBA-EXCEPTION. 
     INVOKE EXCEPT-ID "GET-VALUE" RETURNING EXCEPT-ID-VALUE. 
     DISPLAY API-NAME " is failed.". 
     DISPLAY "Exception-id is " EXCEPT-ID-VALUE. 
     EXIT PROGRAM. 
 END-ERR. 
 END DECLARATIVES. 
*
     MOVE "CORBA::ORB_init" TO API-NAME. 
     INVOKE CORBA "ORB_INIT" USING      APL-NAME
                                        FJ-OM_ORBID 
                             RETURNING  ORB. 
*
     MOVE "CORBA::ORB::BOA_init" TO API-NAME. 
     INVOKE ORB "BOA_INIT" USING      APL-NAME
                                      CORBA-BOA_OAID 
                           RETURNING  BOA.

G.4.5.2 ゲートウェイの登録

サーバアプリケーションが実装するゲートウェイをORBに対して通知します。このため、以下の手順で処理を行います。

CORBA-ORB-RESOLVE_INITIAL_REFERENCESメソッドによりインプリメンテーションリポジトリのオブジェクトリファレンスを取り出します。メソッドのパラメタとしてCORBA-OBJECTID_IMPLEMENTAT-001(値は“ImplementationRepository”)を指定します。

サーバアプリケーションのImplementationRepオブジェクトのオブジェクトリファレンスを求めるため、CORBA-IMPLEMENTATIONDEF-LOOKUP_IDを発行します。

サーバアプリケーションが実装するゲートウェイを登録するために、CORBA-BOA-SET_IMPL_DSIを発行します。

     MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME. 
     INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING      CORBA-OBJECTID_IMPLEMENTAT-001
                                             RETURNING  OBJ. 
     INVOKE FJ-IMPLEMENTATIONREP "NARROW" USING      OBJ
                                          RETURNING  IMPL-REP. 
*
     MOVE "FJ::ImplementationRep::lookup_id" TO API-NAME. 
     INVOKE IMPL-REP "LOOKUP_ID" USING      REP-ID
                                 RETURNING  OBJ. 
     INVOKE CORBA-IMPLEMENTATIONDEF "NARROW" USING      OBJ
                                             RETURNING  IMPL. 
*
     INVOKE ODDEMO-CALCULATOR-IMPL "NEW"  RETURNING  L-DSIBASE. 
     INVOKE BOA "SET_IMPL_DSI" USING L-DSIBASE.

G.4.5.3 サーバの活性化

サーバアプリケーションの初期化が完了すると、ORBに対してその旨を通知します。ORBは、この命令が発行された時点で、クライアントからの要求をサーバアプリケーションに伝えます。


G.4.5.4 ゲートウェイの処理

ゲートウェイでは、以下に示す処理を行います。

(1)メソッドの取得と解析
(2)パラメタの組立て
(3)パラメタの解析
(4)復帰情報の設定
(5)例外情報の設定


ゲートウェイの実装例を以下に示します。


【ゲートウェイ実装例】

 CLASS-ID. ODDEMO-CALCULATOR-IMPL INHERITS DSIBASE. 
 ENVIRONMENT DIVISION. 
 CONFIGURATION SECTION. 
 REPOSITORY. 
     COPY CORBA--REP. 
     COPY SIMPLE--REP. 
     . 
 SPECIAL-NAMES. 
     SYMBOLIC CONSTANT
     COPY CORBA--CONST. 
     COPY SIMPLE--CONST. 
     . 
*
 OBJECT. 
 DATA DIVISION. 
 WORKING-STORAGE SECTION. 
 COPY CORBA--COPY. 
 COPY SIMPLE--COPY. 
 PROCEDURE DIVISION. 
*
 METHOD-ID. INVOKE-METHOD OVERRIDE. 
 DATA DIVISION. 
 WORKING-STORAGE SECTION. 
 01 EXCEP             OBJECT REFERENCE CORBA-SYSTEMEXCEPTION.
 01 L-OP-NAME         OBJECT REFERENCE CORBA-STRING. 
 01 L-BUF             PIC X(30). 
 01 L-NVLIST          OBJECT REFERENCE CORBA-NVLIST. 
 01 NV-A              OBJECT REFERENCE CORBA-NAMEDVALUE. 
 01 NV-B              OBJECT REFERENCE CORBA-NAMEDVALUE. 
 01 NV-RESULT         OBJECT REFERENCE CORBA-NAMEDVALUE. 
 01 ANY-A             OBJECT REFERENCE CORBA-ANY. 
 01 ANY-B             OBJECT REFERENCE CORBA-ANY. 
 01 ANY-RESULT        OBJECT REFERENCE CORBA-ANY. 
 01 CALCULATE-A       TYPE CORBA-LONG. 
 01 CALCULATE-B       TYPE CORBA-LONG. 
 01 CALCULATE-RESULT  TYPE ODDEMO-CALCULATOR-RESULT. 
 01 RET               TYPE CORBA-STATUS. 
 01 API-NAME          PIC   X(50). 
 01 APL-NAME          PIC   X(8)   VALUE     "SIMPLE_S".
 01 ORB               OBJECT REFERENCE CORBA-ORB. 
 01 TMP_TC            OBJECT REFERENCE CORBA-TYPECODE. 
 01 TMP-TCK           TYPE CORBA-TCKIND. 
 01 FLAG              TYPE CORBA-FLAGS.
*
 LINKAGE SECTION. 
 01 L-SVREQ           OBJECT REFERENCE CORBA-SERVERREQUEST. 
*
 PROCEDURE DIVISION  USING    L-SVREQ 
                     RAISING  CORBA-SystemException. 
*  メソッド名の取得
       INVOKE L-SVREQ "OPERATION" RETURNING L-OP-NAME. 
       INVOKE L-OP-NAME "GET-VALUE" RETURNING L-BUF. 
* (1) メソッド名の解析
       IF NOT L-BUF = "calculate"
           INVOKE CORBA-BAD_OPERATION "NEW" RETURNING EXCEP
           EXIT METHOD RAISING EXCEP
       END-IF.
       MOVE "CORBA::ORB_init" TO API-NAME.
       INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB.
* (2) パラメタリストの作成
       INVOKE ORB "CREATE_LIST" USING   2
                                        L-NVLIST.
       INVOKE CORBA-ANY "NEW" RETURNING ANY-A.
       INVOKE CORBA-ANY "NEW" RETURNING ANY-B.
       INVOKE CORBA-ANY "NEW" RETURNING ANY-RESULT.
       SET CORBA-TK_LONG OF TMP-TCK TO TRUE. 
       INVOKE ORB "GET_PRIMITIVE_TC"    USING     TMP-TCK
                                        RETURNING TMP_TC.
       INVOKE ANY-A  "SET-TYPE" USING TMP_TC.
       INVOKE ANY-B  "SET-TYPE" USING TMP_TC.
       INVOKE ODDEMO-CALCULATOR-RESULT--H "TYPE" RETURNING TMP_TC.
       INVOKE ANY-RESULT   "SET-TYPE" USING TMP_TC.
       MOVE "A" TO L-BUF.
       SET CORBA-ARG_IN OF FLAG TO TRUE.
       INVOKE L-NVLIST "ADD_VALUE"  USING      L-BUF
                                               ANY-A
                                               FLAG
                                    RETURNING  NV-A.
       MOVE "B" TO L-BUF
       INVOKE L-NVLIST "ADD_VALUE"  USING      L-BUF
                                               ANY-B
                                               FLAG
                                    RETURNING  NV-B.
* (3) パラメタの解析
       INVOKE L-SVREQ "ARGUMENTS" USING L-NVLIST.
       INVOKE ANY-A "EXTRACT_LONG" RETURNING CALCULATE-A.
       INVOKE ANY-B "EXTRACT_LONG" RETURNING CALCULATE-B.
* 処理部の起動
       INVOKE SELF "CALCULATE"  USING      CALCULATE-A
                                           CALCULATE-B
                                RETURNING  CALCULATE-RESULT.
* (4) 復帰情報の起動
       INVOKE ODDEMO-CALCULATOR-RESULT--H "INSERT" USING ANY-RESULT
                                                         CALCULATE-RESULT. 
       INVOKE L-SVREQ "SET_RESULT" USING ANY-RESULT.
*
 END METHOD  INVOKE-METHOD.

*** 処理部

 METHOD-ID. CALCULATE. 
 DATA DIVISION. 
 WORKING-STORAGE SECTION. 
 01 CALCULATE-ZEROPARAM USAGE OBJECT REFERENCE ODDEMO-CALCULATOR-ZEROPARAM. 
 LINKAGE SECTION. 
 01 CALCULATE-A TYPE CORBA-LONG. 
 01 CALCULATE-B TYPE CORBA-LONG. 
 01 CALCULATE-RESULT TYPE ODDEMO-CALCULATOR-RESULT. 
*
 PROCEDURE DIVISION
          USING      CALCULATE-A
                     CALCULATE-B
          RETURNING  CALCULATE-RESULT
          RAISING    CORBA-SystemException
                     ODDEMO-CALCULATOR-ZEROPARAM. 
*
      IF  CALCULATE-B  = 0
          INVOKE  ODDEMO-CALCULATOR-ZEROPARAM "NEW" RETURNING CALCULATE-ZEROPARAM
          EXIT METHOD RAISING CALCULATE-ZEROPARAM
      END-IF. 
*
      COMPUTE ADD_RESULT      OF CALCULATE-RESULT = CALCULATE-A + CALCULATE-B. 
      COMPUTE SUBTRACT_RESULT OF CALCULATE-RESULT = CALCULATE-A - CALCULATE-B. 
      COMPUTE MULTIPLE_RESULT OF CALCULATE-RESULT = CALCULATE-A * CALCULATE-B. 
      COMPUTE DIVIDE_RESULT   OF CALCULATE-RESULT = CALCULATE-A / CALCULATE-B. 
 END METHOD CALCULATE. 
*
 END OBJECT. 
*
 END CLASS ODDEMO-CALCULATOR-IMPL. 

(1)メソッドの取得と解析

渡されたServerRequestクラスに登録されているオペレーション名をCORBA-SERVERREQUEST-OPERATIONメソッドにより取得します。


(2)パラメタの組立て

CORBA-ORB-CREATE_LISTメソッドにより、アプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、引数として何個のパラメタを格納するかを指定します。結果としてCORBA-NVLISTオブジェクトが返されます。


(3)パラメタの解析

生成したNVLISTオブジェクトを引数としてCORBA-SERVERREQUEST-ARGUMENTSメソッドを呼び出します。この結果、アプリケーションに渡すパラメタ値が取得されます。


(4)復帰情報の設定

CORBA-SERVERREQUEST-SET_RESULTメソッドを発行して復帰情報を設定します。

ゲートウェイを実装するIMPLオブジェクトは、DSIBASEを継承するものとして作成します。また、クライアントからのリクエストに対して起動されるメソッドとしてCORBA-SERVERREQUEST-INVOKE-METHODメソッドを実装します。起動の際、CORBA-SERVERREQUEST-INVOKE-METHODの引数としてServerRequestクラスのオブジェクト(上記例ではANY-RESULT)が渡されます。


(5)例外情報の設定

CORBA-SERVERREQUEST-SET_EXCEPTIONメソッドを発行して例外情報を設定します。
サーバアプリケーションのメソッドが発生するユーザ例外を設定し、クライアントへ通知します。メソッドが発生するユーザ例外は、IDLのオペレーション定義で記述されます。

  REPOSITORY.
       CLASS CORBA-ANY
       CLASS ODDEMO-CALCULATOR-ZEROPARAM—HELPER
       CLASS ODDEMO-CALCULATOR-ZEROPARAM

  DATA DIVISION.
  WORKING-STORAGE SECTION.
  01 DSI-REQUEST   USAGE OBJECT REFERENCE CORBA-SEQRVERREQUEST.
  01 EX            USAGE OBJECT REFERENCE CORBA-ANY.
  01 EX-TYPE       USAGE OBJECT REFERENCE CORBA-TYPECODE.
  PROCEDURE DIVISION.

     INVOKE ODDEMO-CALCULATOR-ZEROPARAM--HELPER "TYPE" RETURNING EX-TYPE.
     INVOKE CORBA-ANY "NEW" RETURNING EX.
     INVOKE EX "SET-TYPE" USING EX-TYPE.

     INVOKE DSI-REQUEST "SET_EXCEPTION" USING EX.

【ゲートウェイIMPLクラスの必須メソッド】

 METHOD-ID. INVOKE-METHOD OVERRIDE. 
 DATA DIVISION. 
 LINKAGE SECTION. 
 01 L-SVREQ USAGE OBJECT REFERENCE CORBA-SERVERREQUEST. 
 PROCEDURE DIVISION  USING    L-SVREQ 
                     RAISING  CORBA-SystemException.