ここでは、実際にCORBAサーバアプリケーションを作成しながら説明します。
作成するアプリケーションの内容
以下の2項演算プログラムを作成します。
2つのパラメタの四則演算を行う。
メソッド名は、加減乗除に対してそれぞれ、addop、subop、mltop、divopとする。
各メソッドは復帰値なし。
各メソッドは1つの構造体型のパラメタを持つ。構造体は、2項演算の対象となる2つの変数と、演算結果を格納する変数で構成する。
2項演算の対象となる2つの変数はクライアントで設定し、演算結果はサーバアプリで設定するため、構造体型のパラメタのモードはinoutにする。
乗算、除算の場合は、パラメタをチェックしどちらか一方が0である場合、例外情報を返却する。
作成手順
1. Interstage基盤サービスの起動
CORBAサーバアプリケーションのプロジェクトを作成する前に、Interstage基盤サービス操作ツールによってJ2EE実行環境のためのサービスを起動しておく必要があります。デフォルトの状態では必要なサービスは起動されていないため、“Interstage基盤サービスの起動”に示す手順でサービスを起動してください。
2. CORBAサーバプロジェクトの作成
Interstage Studioワークベンチを起動します。
COBOLパースペクティブが表示されていない場合は、以下の手順でCOBOLパースペクティブを表示します。
メニューバーから[ウィンドウ(W)] > [パースペクティブ] > [パースペクティブを開く(O)] > [その他(O)]を選択すると[パースペクティブを開く]ダイアログボックスが表示されます。
[COBOL]を選択して[OK]ボタンをクリックします。
メニューバーから[ファイル] > [新規] > [CORBAサーバプロジェクト]を選択します。
→ CORBAサーバプロジェクト生成ウィザードが起動され、[CORBAサーバプロジェクト]ページが表示されます。
プロジェクト名と保存フォルダを入力し、[次へ]ボタンをクリックします。この例では以下とします。
設定項目 | 設定内容 |
---|---|
プロジェクト名 | CALCSV |
プロジェクトコンテンツ | [ワークスペース内に新規プロジェクトを作成]を選択 |
→ ターゲットを定義するページが表示されます。
ターゲットを定義するページでは何も変更せずに、[次へ]ボタンをクリックします。
→ [ビルド環境]ページが表示されます。
ビルド環境を設定する画面では何も変更せずに、[次へ]ボタンをクリックします。
→ [選択]ページが表示されます。
[コード生成を行う]をチェックし、[使用可能なコード生成ウィザード]から[CORBAサーバアプリケーション]を選択して、[完了]ボタンをクリックします。
→ CORBAサーバプロジェクトとして、CALCSVプロジェクトが生成され、続いて[CORBAサーバアプリケーション生成ウィザード]が起動されます。
以下を入力し、[次へ]ボタンをクリックします。
設定項目 | 設定内容 |
---|---|
モジュール名 | SAMPLE(任意) |
クラス名 | CALCSV(プロジェクト名固定) |
例外の生成(*1) | チェックする |
デフォルト処理の生成(*2) | チェックする |
コメントの生成(*3) | チェックする |
*1: 乗算、除算の例外情報のために[例外の生成]をチェックします。チェックした場合は、以下の例外宣言がIDL中に生成されます。
exception CDException{ string CDExceptionMsg; long CDExceptionCode; };
*2: [デフォルト処理の生成]をチェックすると、サーバアプリケーションとして実装すべきメソッド定義と、そのメソッドの処理を生成します。チェックしない場合は、メソッドの宣言のみが生成されます。
*3: [コメントの生成]をチェックした場合は、生成ひな型ソース中にコメントを生成します。
→ [定数宣言]ページが表示されます。
この例では、例外発生時に返却するエラーメッセージを2個定義します。以下のように設定し、[次へ]ボタンをクリックします。
定数1
設定項目 | 設定内容 |
---|---|
型 | 英数文字列 |
定数名 | MSG1 |
初期値 | "item1 is zero" |
定数2
設定項目 | 設定内容 |
---|---|
型 | 英数文字列 |
定数名 | MSG2 |
初期値 | "item2 is zero" |
→ [型宣言]ページが表示されます。
ここでは繰り返し項目などを定義しますが、この例で定義する型宣言はありません。[次へ]ボタンをクリックします。
→ [構造体宣言]ページが表示されます。
この例では、入力する項目が2個、演算結果を返却する領域が1個必要であるため、それらの領域を1つの構造体として宣言します。[追加]ボタンをクリックします。
→ [構造体の定義]ダイアログボックスが表示されます。
ここでは、構造体「S1」を以下の要素を持つ構造体として宣言し、[OK]ボタンをクリックします。
変数名 | 型 | 使用目的 |
---|---|---|
item1 | 4バイト整数 | 2項演算のうちの1項目(クライアントから値設定) |
item2 | 4バイト整数 | 2項演算のうちの1項目(クライアントから値設定) |
result | 4バイト整数 | 2項演算結果 (サーバが値設定) |
[構造体宣言]ページの[構造体の定義]に「S1」が追加されていることを確認し、[次へ]ボタンをクリックします。
→ [メソッド宣言]ページが表示されます。
ビジネスメソッドを宣言します。ここでは、“作成するアプリケーションの内容”に従い、メソッド「addop」、「subop」、「mltop」、「divop」を宣言します。[追加]ボタンをクリックします。
→ [利用者メソッドの定義]ダイアログボックスが表示されます。
各メソッドの定義情報を設定します。
addopメソッド
設定項目 | 設定内容 |
---|---|
メソッド名 | addop |
戻り値の型 | なし(void) |
例外を発生させる | チェックしない |
パラメタリスト | 変数名 : param1 |
subopメソッド
設定項目 | 設定内容 |
---|---|
メソッド名 | subop |
戻り値の型 | なし(void) |
例外を発生させる | チェックしない |
パラメタリスト | 変数名 : param1 |
mltopメソッド
設定項目 | 設定内容 |
---|---|
メソッド名 | mltop |
戻り値の型 | なし(void) |
例外を発生させる | チェックする (※3) |
パラメタリスト | 変数名 : param1 |
divopメソッド
設定項目 | 設定内容 |
---|---|
メソッド名 | divop |
戻り値の型 | なし(void) |
例外を発生させる | チェックする (※3) |
パラメタリスト | 変数名 : param1 |
(※1) 「S1」は、構造体定義で宣言した構造体名です。
(※2) 構造体「S1」は、クライアント、サーバの両アプリケーションで値を設定するため、inoutにします。
(※3) 乗算および除算の場合は、例外を通知します。
→ すべてのメソッドの定義が完了すると、以下のように表示されます。
[完了]ボタンをクリックします。[依存]ビューの[ソースファイル]フォルダにひな型ソースが生成されます。この例では、以下のファイルが生成されます。
ファイル名 | 説明 |
---|---|
CALCSV.cob | メインプログラム(サーバアプリケーションのフレームワーク) |
SAMPLE-CALCSV-IMPL.cob | ビジネスメソッドプログラム |
SAMPLE-CALCSV--INIT.cob | サーバアプリケーション登録プログラム |
USCALCSV.idl | インタフェースファイル(IDLファイル) |
上記以外の"SAMPLE"で始まるCOBOLソースファイル | IDLコンパイラが生成したスケルトン用ファイル |
3. プログラムの編集
生成されたIDLファイルおよびCOBOLソースプログラムを編集します。
// モジュール宣言 module SAMPLE { // 定数宣言 const string MSG1 = "item1 is zero" ; const string MSG2 = "item2 is zero" ; // 型宣言 // 構造体宣言 struct S1 { long item1; long item2; long result; }; // 例外宣言 exception CDException{ string CDExceptionMsg; long CDExceptionCode; }; // ユーザインタフェース宣言 interface CALCSV { void addop(inout S1 param1); void subop(inout S1 param1); void mltop(inout S1 param1) raises (CDException); void divop(inout S1 param1) raises (CDException); }; };
今回は、特に修正の必要がありませんが、ここで、IDLファイルの内容を編集することも可能です。
※インタフェースの内容を変更した場合は、必ずビジネスメソッドのプログラムソースと等価になるように両方を修正する必要があります。
ひな型は、選択されたアプリケーション形態に対して標準的なものを生成しているため、カスタマイズが必要な場合は修正してください。今回は、特に修正の必要がありません。
IDENTIFICATION DIVISION. PROGRAM-ID. CALCSV. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. COPY CORBA--REP. COPY USCALCSV--REP. . SPECIAL-NAMES. SYMBOLIC CONSTANT COPY CORBA--CONST. . DATA DIVISION. WORKING-STORAGE SECTION. COPY CORBA--COPY. COPY USCALCSV--COPY. 01 API-NAME PIC X(50). 01 APL-NAME PIC X(64) VALUE "CALCSV". 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(128) VALUE "IDL:SAMPLE/CALCSV:1.0".(※1) 01 OBJ USAGE OBJECT REFERENCE CORBA-OBJECT. 01 EXCEPT-ID USAGE OBJECT REFERENCE CORBA-STRING. 01 EXCEPT-ID-VALUE PIC X(50). LINKAGE SECTION. PROCEDURE DIVISION. * * ORBの初期化 * INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB. * * BOAの初期化 * INVOKE ORB "BOA_INIT" USING APL-NAME CORBA-BOA_OAID RETURNING BOA. * * インプリメンテーションリポジトリオブジェクトの取得 * INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-OBJECTID_IMPLEMENTAT-001 RETURNING OBJ. INVOKE FJ-IMPLEMENTATIONREP "NARROW" USING OBJ RETURNING IMPL-REP. * * インプリメンテーション情報の取得 * INVOKE IMPL-REP "LOOKUP_ID" USING REP-ID RETURNING OBJ. INVOKE CORBA-IMPLEMENTATIONDEF "NARROW" USING OBJ RETURNING IMPL. * SET OBJ TO NULL. * * サーバの活性化をODに通知する * MOVE "CORBA::BOA::IMPL_IS_READY" TO API-NAME. INVOKE BOA "IMPL_IS_READY" USING IMPL. * STOP RUN. END PROGRAM CALCSV.
(※1) リポジトリID
CORBAサーバアプリケーションを一意に決定するためのIDです。デフォルトは、「IDL:モジュール名/インタフェース名:1.0」です。詳細は、Interstage Application Serverのマニュアルを参照してください。
このプログラムは、サーバアプリケーションがCORBAサーバとして使用できるように登録する処理です。特に修正の必要はありません。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-CALCSV--INIT. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS SAMPLE-CALCSV CLASS SAMPLE-CALCSV-IMPL . DATA DIVISION. WORKING-STORAGE SECTION. LINKAGE SECTION. 01 RET USAGE OBJECT REFERENCE SAMPLE-CALCSV. PROCEDURE DIVISION RETURNING RET . INVOKE SAMPLE-CALCSV-impl "new" RETURNING RET. EXIT PROGRAM. END PROGRAM SAMPLE-CALCSV--INIT.
ウィザードで入力したメソッド「addop」、「subop」、「mltop」、「divop」が宣言されているので、処理を実装します。青色(下線付き)の部分のコードを追加します。
CLASS-ID. SAMPLE-CALCSV-IMPL AS "SAMPLE-CALCSV-IMPL" INHERITS SAMPLE-CALCSV . ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. COPY CORBA--REP. COPY USCALCSV--REP. . SPECIAL-NAMES. SYMBOLIC CONSTANT COPY CORBA--CONST. COPY USCALCSV--CONST. . OBJECT. DATA DIVISION. WORKING-STORAGE SECTION. COPY CORBA--COPY. COPY USCALCSV--COPY. PROCEDURE DIVISION . METHOD-ID. ADDOP AS "ADDOP" OVERRIDE. * <IDL-INFO-START> * void addop(inout S1 param1) * <IDL-INFO-END> DATA DIVISION. WORKING-STORAGE SECTION. LINKAGE SECTION. 01 PARAM1 TYPE SAMPLE-S1. PROCEDURE DIVISION USING PARAM1 . COMPUTE result OF param1 = item1 OF param1 + item2 OF param1. END METHOD ADDOP. METHOD-ID. SUBOP AS "SUBOP" OVERRIDE. * <IDL-INFO-START> * void subop(inout S1 param1) * <IDL-INFO-END> DATA DIVISION. WORKING-STORAGE SECTION. LINKAGE SECTION. 01 PARAM1 TYPE SAMPLE-S1. PROCEDURE DIVISION USING PARAM1 . COMPUTE result OF param1 = item1 OF param1 - item2 OF param1. END METHOD SUBOP. METHOD-ID. MLTOP AS "MLTOP" OVERRIDE. * <IDL-INFO-START> * void mltop(inout S1 param1) * <IDL-INFO-END> DATA DIVISION. WORKING-STORAGE SECTION. 01 W-EXCEPTION OBJECT REFERENCE SAMPLE-CDException. 01 W-STRING OBJECT REFERENCE CORBA-STRING. LINKAGE SECTION. 01 PARAM1 TYPE SAMPLE-S1. PROCEDURE DIVISION USING PARAM1 RAISING SAMPLE-CDEXCEPTION . * 例外処理 IF item1 OF param1 = 0 THEN INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION INVOKE CORBA-STRING "NEW" RETURNING W-STRING INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG1 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING EXIT METHOD RAISING W-EXCEPTION END-IF IF item2 OF param1 = 0 THEN INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION INVOKE CORBA-STRING "NEW" RETURNING W-STRING INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG2 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING EXIT METHOD RAISING W-EXCEPTION END-IF COMPUTE result OF param1 = item1 OF param1 * item2 OF param1. END METHOD MLTOP. METHOD-ID. DIVOP AS "DIVOP" OVERRIDE. * <IDL-INFO-START> * void divop(inout S1 param1) * <IDL-INFO-END> DATA DIVISION. WORKING-STORAGE SECTION. 01 W-EXCEPTION OBJECT REFERENCE SAMPLE-CDException. 01 W-STRING OBJECT REFERENCE CORBA-STRING. LINKAGE SECTION. 01 PARAM1 TYPE SAMPLE-S1. PROCEDURE DIVISION USING PARAM1 RAISING SAMPLE-CDEXCEPTION . * 例外処理 IF item1 OF param1 = 0 THEN INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION INVOKE CORBA-STRING "NEW" RETURNING W-STRING INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG1 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING EXIT METHOD RAISING W-EXCEPTION END-IF IF item2 OF param1 = 0 THEN INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION INVOKE CORBA-STRING "NEW" RETURNING W-STRING INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG2 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING EXIT METHOD RAISING W-EXCEPTION END-IF COMPUTE result OF param1 = item1 OF param1 / item2 OF param1. END METHOD DIVOP. END OBJECT. END CLASS SAMPLE-CALCSV-IMPL.
ポイント
構造体「S1」は、TYPE宣言されます。
構造体「S1」の要素は集団項目として定義されているため、集団項目のように使用できます。
例外を通知する場合は、例外クラスのインスタンスを生成(new)し、メンバーに値を設定します。
4. プロジェクトのビルド
自動ビルドが設定されている場合、COBOLソースプログラムを保存した直後にビルドが実行されます。自動ビルドが設定されていない場合は、[依存]ビューまたは[構造]ビューで、CORBAサーバプロジェクトを選択し、メニューバーから[プロジェクト] > [プロジェクトのビルド]を選択して、ビルドを実行します。
5. プログラムの実行
CORBAサーバアプリケーションはワークユニット上で実行します。以下に、CORBAサーバアプリケーションの動作確認の手順の概要を示します。
ポイント
MyCORBADebugについて
本チュートリアルでは、MyCORBADebugという名前のワークユニットを使用します。MyCORBADebugワークユニットを作成する方法は、“11.5.1.4.3 CORBAワークユニットの作成”を参照してください。
実行資産のコピー
ビルドで生成された実行ファイルとダイナミックリンクライブラリを実行環境にコピーします。
ここでは、以下のようにコピーします。
ファイル:CALCSV.exe、USCALCSV.dll コピー先フォルダ:C:\Interstage\APS\var\CORBA_WU\MyCORBADebug
任意のフォルダにコピー可能ですが、このチュートリアルでは、MyCORBADebugのデフォルトのアプリケーション格納フォルダにコピーします。
アプリケーション動作カレントディレクトリの作成
ワークユニットの起動で必要となるアプリケーション動作カレントディレクトリを作成します。
このチュートリアルでは、ワークユニット作成時にデフォルト値を使用しているため、以下のディレクトリを用意します。
C:\Interstage\APS\var\CORBA_WU\MyCORBADebug\work
CORBAサーバアプリケーションの配備
スタートメニューから[Interstage Studio] > [Interstage管理コンソール]を選択します。
→ [Interstage管理コンソール]が起動されます。
Windowsにログインしているユーザ名とパスワードを入力し、[ログイン]ボタンをクリックします。
Interstage管理コンソールの左側のツリーから、[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [MyCORBADebug]を選択します。
画面右側で[配備]タブを選択します。
→ [配備]ページが表示されます。
[配備]ページを入力します。
インプリメンテーションリポジトリIDは、以下の形式で指定します。
IDL:モジュール名/インタフェース名:1.0
このチュートリアルの場合は、「IDL:SAMPLE/CALCSV:1.0」を入力します。
実行ファイル名は、最初にコピーしたEXEファイルを指定します。
このチュートリアルの場合は、「CALCSV.exe」を入力します。
詳細設定の[表示]を選択し、CORBAアプリケーションの[表示]を選択します。表示された詳細設定画面の[動作モード]で、[SYNC_END]を選択します。
インタフェース定義の[表示]を選択します。[追加]ボタンをクリックし、インタフェースリポジトリID、ネーミングサービス登録名、およびライブラリパス名を指定します。
項目 | 入力名 |
---|---|
インタフェースリポジトリID | IDL:SAMPLE/CALCSV:1.0 |
ネーミングサービス登録名 | SAMPLE::CALCSV |
ライブラリパス名 | USCALCSV.dll |
[一覧へ反映]ボタンをクリックした後、[配備]ボタンをクリックして、配備を行います。
ワークユニットの起動
配備時に起動指定で、[配備完了後、ワークユニットを起動する]をチェックしていない場合は、以下のようにして作成したワークユニットを起動します。
Interstage管理コンソールの左側のツリーから[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [MyCORBADebug]を選択します。
画面右側の[操作]タブを選択し、[起動]ボタンをクリックします。
アプリケーション動作カレントディレクトリが存在しない場合、起動時にエラーが発生します。アプリケーション動作カレントディレクトリは、ワークユニットの[環境設定]タブで確認できます。
クライアントアプリケーションの実行
クライアントアプリケーションを実行し、CORBAサーバアプリケーションにアクセスします。
クライアントアプリケーションの作成、実行方法の詳細については、“11.2.3 CORBAクライアントアプリケーションの作成”を参照してください。