グローバルトランザクション運用を行うためには、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.ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを獲得します。
Currentインタフェースのオブジェクトリファレンスを獲得します。
COSTRANSACTIONS-CURRENT-BEGINメソッドでトランザクションの開始を宣言します。
サーバアプリケーションを呼び出します。
サーバアプリケーションの復帰状態を確認して、トランザクションの状態を決定します。トランザクションを正常終了する場合は、COSTRANSACTIONS-CURRENT-COMMITメソッドでトランザクションをコミットします。トランザクションを異常終了する場合は、COSTRANSACTIONS-CURRENT-ROLLBACKメソッドでトランザクションをロールバックします。
クライアントアプリケーションからサーバアプリケーションを呼び出す形態を以下に示します。
サーバアプリケーションを呼び出し、サーバアプリケーションのメソッドが終了した時点でクライアントアプリケーションに制御が戻ります。
サーバアプリケーションを呼び出し、サーバアプリケーションのメソッドの終了を待たずにクライアントアプリケーションに制御が戻ります。クライアントアプリケーションは、任意のタイミングでサーバアプリケーションのメソッドの終了を問い合わせます。
■同期型
同期型呼出しは、クライアントアプリケーションからサーバアプリケーションを呼び出し、そのサーバアプリケーションの処理終了を待ち合わせる呼出し形態です。
同期型の呼出し形態について、以下に示します。

同期型には、以下の2つのインタフェースがあります。詳細については、“リファレンスマニュアル(API編)”を参照してください。
静的起動インタフェース
サーバアプリケーションのメソッド名を指定して呼び出します。
動的起動インタフェース
Requestインタフェースのinvokeメソッドでサーバアプリケーションを呼び出します。
動的起動インタフェースにおいて、遅延同期送信を行う場合の注意事項を以下に示します。
遅延同期送信の呼出し元は、その呼出しの復帰が完了するまでデータベースの操作を禁止します。

遅延同期送信の呼出し先は、データベースを使用する場合は、複数の呼出しが同じデータベースをアクセスできません。
遅延同期送信で呼び出されたアプリケーションから、同時に同一のデータベースを操作することはできません。

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

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

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

Requestインタフェースを使用します。詳細については、“リファレンスマニュアル(API編)”を参照してください。
非同期型を使用する場合のクライアントアプリケーションの処理論理を以下に示します。

サーバアプリケーションAのメソッド1を非同期型で呼び出します。
サーバアプリケーションBのメソッド2を非同期型で呼び出します。
メソッド1の処理終了を問い合わせます。
メソッド2の処理終了を問い合わせます。
静的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。
■初期化
初期化処理として、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動的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。
■初期化
初期化処理として、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で定義されたモジュール名、インタフェース名、オペレーション名、パラメタが階層構造で格納されています。
インタフェースリポジトリからサーバアプリケーションの情報を獲得する方法について、以下に示します。
インタフェースリポジトリからサーバアプリケーションの情報を取得するためには、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. サーバアプリケーションのメソッド名をパラメタとして、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.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. サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成するために、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. 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は、サーバの処理結果を格納するための領域です。
定義例を以下に示します。
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.