Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編)
目次 索引 前ページ次ページ

第3章 クライアントアプリケーションの作成> 3.3 クライアントアプリケーションソースの作成(COBOL)> 3.3.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.

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

Copyright 2008 FUJITSU LIMITED