ここでは、実際にCORBAサーバアプリケーションを作成しながら説明します。
1. 作成するプログラムの内容
ここでは、2項演算プログラムを作成します。
2つのパラメタの四則演算を行うプログラム
メソッドは、加減乗除に対してそれぞれ、addop、subop、mltop、divopというメソッド名にする
それぞれのメソッドは復帰値なしで、パラメタを構造体形式にして、その構造体の中に演算結果を設定しクライアント側で参照可能にする。(パラメタはクライアントで設定し、かつ、演算結果はサーバアプリで設定するため、パラメタのモードはinoutにする必要がある)
乗算、除算の場合は、パラメタをチェックしどちらか一方が0である場合、例外情報を返却する。
2. Interstage基盤サービスの起動
CORBAサーバアプリケーションのプロジェクトを作成する前に、Interstage基盤サービス操作ツールによってJ2EE実行環境のためのサービスをあらかじめ起動しておく必要があります。デフォルトの状態では必要なサービスは起動されていないため、以下の手順でサービスを起動してください。
スタートメニューから[Interstage] > [Studio] > [Interstage基盤サービス操作ツール]を選択します。
Interstage基盤サービス操作ツールのウィンドウの[J2EE実行環境を使用する]チェックボックスをチェック状態にします。
[必須サービスのみ起動状態にする]ボタンが有効の場合、ボタンをクリックしてサービスを起動します。ボタンが無効の場合は操作は不要です。
<必要なサービス>が全て実行中となっていることを確認してから[閉じる]ボタンをクリックしてInterstage基盤サービス操作ツールを終了します。
3. プロジェクトの作成
COBOLパースペクティブを表示していない場合は、以下の手順でCOBOLパースペクティブを表示してください。
メニューバーから[ウィンドウ] > [パースペクティブを開く] > [その他]を選択すると[パースペクティブを開く]ダイアログボックスが表示されます。
[COBOL]を選択して[OK]ボタンをクリックします。
ワークベンチのメニューバーから[ファイル] > [新規] > [CORBAサーバプロジェクト]を選択すると、新規CORBAサーバプロジェクトが表示されます。
プロジェクト名と保存フォルダを入力します。
設定項目 | 設定内容 |
---|---|
プロジェクト名 | CALCSV |
プロジェクトコンテンツ | [ワークスペース内に新規プロジェクトを作成]を選択 |
ターゲットを指定する画面です。ここでは何も変更せずに次に進みます。
ビルド環境を指定する画面です。ここでは何も変更せずに次に進みます。
生成するコードを選択する画面です。コード生成ウィザードとして[CORBAサーバアプリケーション]が選択されていることを確認し、[終了]をクリックします。
4. CORBAサーバアプリケーション生成ウィザードによるひな型作成
プロジェクトが作成された後に、CORBAサーバアプリケーション生成ウィザードが起動されます。
プロジェクト名と保存フォルダを入力します。
設定項目 | 設定内容 |
---|---|
モジュール名 | SAMPLE(任意) |
クラス名 | CALCSV(プロジェクト名固定) |
例外の生成 | チェックする |
デフォルト処理の生成 | チェックする |
コメントの生成 | チェックする |
乗算、除算の例外情報のために[例外の生成]をチェックします。チェックした場合は、以下の例外宣言がIDL中に生成されます。
exception CDException{ string CDExceptionMsg; long CDExceptionCode; }; |
デフォルト処理の生成をチェックすると、サーバアプリケーションとして実装すべきメソッド定義と、そのメソッドの処理を生成します。チェックしない場合は、メソッドの宣言のみが生成されます。
コメントの生成をチェックした場合は、生成ひな型ソース中にコメントを生成します。
2枚目では、定数を宣言します。ここでは、例外発生時に返却するエラーメッセージを2個定義します。
<定数1>
設定項目 | 設定内容 |
---|---|
型 | 英数文字列 |
定数名 | MSG1 |
初期値 | "item1 is zero" |
<定数2>
設定項目 | 設定内容 |
---|---|
型 | 英数文字列 |
定数名 | MSG2 |
初期値 | "item2 is zero" |
3枚目では型宣言を行います。今回は必要ありませんが、ここでは繰り返し項目などを定義します。
なにもせず、次に進んでください。
ここで、構造体を宣言します。今回のプログラムでは、クライアントからの入力となる項目が2個、演算結果を返却する領域が1個必要であるため、それらの領域を1つの構造体として宣言することにします。
この画面で、[追加]ボタンを押して、構造体定義ダイアログで構造体を宣言します。
ここでは、構造体「S1」を以下の要素を持つ構造体として宣言します。
変数名 | 型と使用目的 |
---|---|
item1 | 4バイト整数 , |
item2 | 4バイト整数 , |
result | 4バイト整数 , |
次に、ビジネスメソッドを宣言します。ここでは、「1. 作成するプログラムの内容」に従い、メソッド「addop」、「subop」、「mltop」、「divop」を宣言します。
この画面で、[追加]ボタンを押して、利用者メソッドの定義ダイアログでメソッドを宣言します。
下記のダイアログは、メソッド addopを設定している様子です。
各メソッドの定義情報を説明します。
<メソッド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コンパイラが生成したスケルトン用ファイル |
5. プログラムの編集
// モジュール宣言 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ファイルの内容を編集することも可能です。
※インタフェースの内容を変更した場合は、必ずビジネスメソッドのプログラムソースと等価になるように両方を修正する必要があります。
ひな型は、選択されたアプリケーション形態に対して標準的なものを生成しているため、カスタマイズが必要な場合は修正してください。今回は、特に修正の必要がありません。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. CALCSV. 000030 ENVIRONMENT DIVISION. 000040 CONFIGURATION SECTION. 000050 REPOSITORY. 000060 COPY CORBA--REP. 000070 COPY USCALCSV--REP. 000080 . 000090 SPECIAL-NAMES. 000100 SYMBOLIC CONSTANT 000110 COPY CORBA--CONST. 000120 . 000130 DATA DIVISION. 000140 WORKING-STORAGE SECTION. 000150 COPY CORBA--COPY. 000160 COPY USCALCSV--COPY. 000170 01 API-NAME PIC X(50). 000180 01 APL-NAME PIC X(64) VALUE "CALCSV". 000190 01 ORB USAGE OBJECT REFERENCE CORBA-ORB. 000200 01 BOA USAGE OBJECT REFERENCE CORBA-BOA. 000210 01 IMPL-REP USAGE OBJECT REFERENCE FJ-IMPLEMENTATIONREP. 000220 01 IMPL USAGE OBJECT REFERENCE CORBA-IMPLEMENTATIONDEF. 000230 01 REP-ID PIC X(128) VALUE "IDL:SAMPLE/CALCSV:1.0".(※1) 000240 01 OBJ USAGE OBJECT REFERENCE CORBA-OBJECT. 000250 01 EXCEPT-ID USAGE OBJECT REFERENCE CORBA-STRING. 000260 01 EXCEPT-ID-VALUE PIC X(50). 000270 LINKAGE SECTION. 000280 PROCEDURE DIVISION 000290 . 000300* 000310* ORBの初期化 000320* 000330 INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB. 000340* 000350* BOAの初期化 000360* 000370 INVOKE ORB "BOA_INIT" USING APL-NAME CORBA-BOA_OAID RETURNING BOA. 000380* 000390* インプリメンテーションリポジトリオブジェクトの取得 000400* 000410 INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-OBJECTID_IMPLEMENTAT-001 RETURNING OBJ. 000420 INVOKE FJ-IMPLEMENTATIONREP "NARROW" USING OBJ RETURNING IMPL-REP. 000430* 000440* インプリメンテーション情報の取得 000450* 000460 INVOKE IMPL-REP "LOOKUP_ID" USING REP-ID RETURNING OBJ. 000470 INVOKE CORBA-IMPLEMENTATIONDEF "NARROW" USING OBJ RETURNING IMPL. 000480* 000490 SET OBJ TO NULL. 000500* 000510* サーバの活性化をODに通知する 000520* 000530 MOVE "CORBA::BOA::IMPL_IS_READY" TO API-NAME. 000540 INVOKE BOA "IMPL_IS_READY" USING IMPL. 000550* 000560 STOP RUN. 000570 END PROGRAM CALCSV.
(※1) リポジトリID
CORBAサーバアプリケーションを一意に決定するためのIDです。デフォルトは、「IDL:モジュール名/インタフェース名:1.0」です。詳細は、Interstage Application Serverのマニュアルを参照してください。
このプログラムは、サーバアプリケーションがCORBAサーバとして使用できるように登録する処理です。特に修正の必要はありません。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. SAMPLE-CALCSV--INIT. 000030 ENVIRONMENT DIVISION. 000040 CONFIGURATION SECTION. 000050 REPOSITORY. 000060 CLASS SAMPLE-CALCSV 000070 CLASS SAMPLE-CALCSV-IMPL 000080 . 000090 DATA DIVISION. 000100 WORKING-STORAGE SECTION. 000110 LINKAGE SECTION. 000120 01 RET USAGE OBJECT REFERENCE SAMPLE-CALCSV. 000130 PROCEDURE DIVISION 000140 RETURNING RET 000150 . 000160 INVOKE SAMPLE-CALCSV-impl "new" RETURNING RET. 000170 EXIT PROGRAM. 000180 END PROGRAM SAMPLE-CALCSV-- INIT.
ウィザードで入力したメソッド「addop」、「subop」、「mltop」、「divop」の宣言がされているので、処理を実装します。太字(青色)の部分が追加したコードです。
000010 CLASS-ID. SAMPLE-CALCSV-IMPL AS "SAMPLE-CALCSV-IMPL" INHERITS 000020 SAMPLE-CALCSV 000030 . 000040 ENVIRONMENT DIVISION. 000050 CONFIGURATION SECTION. 000060 REPOSITORY. 000070 COPY CORBA--REP. 000080 COPY USCALCSV--REP. 000090 . 000100 SPECIAL-NAMES. 000110 SYMBOLIC CONSTANT 000120 COPY CORBA--CONST. 000121 COPY USCALCSV--CONST. 000130 . 000140 OBJECT. 000150 DATA DIVISION. 000160 WORKING-STORAGE SECTION. 000170 COPY CORBA--COPY. 000180 COPY USCALCSV--COPY. 000190 PROCEDURE DIVISION 000200 . 000210 METHOD-ID. ADDOP AS "ADDOP" OVERRIDE. 000220* <IDL-INFO-START> 000230* void addop(inout S1 param1) 000240* <IDL-INFO-END> 000250 DATA DIVISION. 000260 WORKING-STORAGE SECTION. 000270 LINKAGE SECTION. 000280 01 PARAM1 TYPE SAMPLE-S1. 000290 PROCEDURE DIVISION 000300 USING 000310 PARAM1 000320 . 000321 COMPUTE result OF param1 = item1 OF param1 + item2 OF param1. 000330 END METHOD ADDOP. 000340 METHOD-ID. SUBOP AS "SUBOP" OVERRIDE. 000350* <IDL-INFO-START> 000360* void subop(inout S1 param1) 000370* <IDL-INFO-END> 000380 DATA DIVISION. 000390 WORKING-STORAGE SECTION. 000400 LINKAGE SECTION. 000410 01 PARAM1 TYPE SAMPLE-S1. 000420 PROCEDURE DIVISION 000430 USING 000440 PARAM1 000450 . 000451 COMPUTE result OF param1 = item1 OF param1 - item2 OF param1. 000460 END METHOD SUBOP. 000470 METHOD-ID. MLTOP AS "MLTOP" OVERRIDE. 000480* <IDL-INFO-START> 000490* void mltop(inout S1 param1) 000500* <IDL-INFO-END> 000510 DATA DIVISION. 000520 WORKING-STORAGE SECTION. 000521 01 W-EXCEPTION OBJECT REFERENCE SAMPLE-CDException. 000522 01 W-STRING OBJECT REFERENCE CORBA-STRING. 000530 LINKAGE SECTION. 000540 01 PARAM1 TYPE SAMPLE-S1. 000550 PROCEDURE DIVISION 000560 USING 000570 PARAM1 000580 RAISING 000590 SAMPLE-CDEXCEPTION 000600 . 000601* 例外処理 000602 IF item1 OF param1 = 0 000603 THEN 000604 INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION 000605 MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION 000606 INVOKE CORBA-STRING "NEW" RETURNING W-STRING 000607 INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG1 000608 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING 000609 EXIT METHOD RAISING W-EXCEPTION 000610 END-IF 000611 IF item2 OF param1 = 0 000612 THEN 000613 INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION 000614 MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION 000615 INVOKE CORBA-STRING "NEW" RETURNING W-STRING 000616 INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG2 000617 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING 000618 EXIT METHOD RAISING W-EXCEPTION 000619 END-IF 000620 COMPUTE result OF param1 = item1 OF param1 * item2 OF param1. 000621 000622 END METHOD MLTOP. 000623 METHOD-ID. DIVOP AS "DIVOP" OVERRIDE. 000630* <IDL-INFO-START> 000640* void divop(inout S1 param1) 000650* <IDL-INFO-END> 000660 DATA DIVISION. 000670 WORKING-STORAGE SECTION. 000671 01 W-EXCEPTION OBJECT REFERENCE SAMPLE-CDException. 000672 01 W-STRING OBJECT REFERENCE CORBA-STRING. 000680 LINKAGE SECTION. 000690 01 PARAM1 TYPE SAMPLE-S1. 000700 PROCEDURE DIVISION 000710 USING 000720 PARAM1 000730 RAISING 000740 SAMPLE-CDEXCEPTION 000750 . 000751* 例外処理 000752 IF item1 OF param1 = 0 000753 THEN 000754 INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION 000755 MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION 000756 INVOKE CORBA-STRING "NEW" RETURNING W-STRING 000757 INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG1 000758 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING 000759 EXIT METHOD RAISING W-EXCEPTION 000760 END-IF 000761 IF item2 OF param1 = 0 000762 THEN 000763 INVOKE SAMPLE-CDException "NEW" RETURNING W-EXCEPTION 000764 MOVE -1 TO CDEXCEPTIONCODE OF W-EXCEPTION 000765 INVOKE CORBA-STRING "NEW" RETURNING W-STRING 000766 INVOKE W-STRING "SET-VALUE" USING SAMPLE-MSG2 000767 SET CDEXCEPTIONMSG OF W-EXCEPTION TO W-STRING 000768 EXIT METHOD RAISING W-EXCEPTION 000769 END-IF 000770 COMPUTE result OF param1 = item1 OF param1 / item2 OF param1. 000771 000772 END METHOD DIVOP. 000773 END OBJECT. 000780 END CLASS SAMPLE-CALCSV-IMPL.
ポイント
構造体「S1」は、固定長であるため、TYPE宣言されます。
構造体「S1」の要素は集団項目として定義されているため、集団項目のように使用できます。
例外を通知する場合は、例外クラスのインスタンスを生成(new)し、メンバに値を設定します。
6. プロジェクトのビルド
SAMPLE-CALCSV-IMPL.cobの編集画面のコンテキストメニューから[保存]を選択してください。CORBAサーバアプリケーションが自動的にビルドされます。
ただし、メニューの[プロジェクト] > [自動的にビルド]のチェックを解除している場合はビルドがされないため、チェックしなおしてください。チェックをするとにCORBAサーバアプリケーションが自動的にビルドされます。
7. プログラムの実行
CORBAサーバアプリケーションはワークユニット上で実行します。以下に、CORBAサーバアプリケーションの動作確認の手順の概要を示します。
ポイント
MyCORBADebugについて
本チュートリアルでは、MyCORBADebugという名前のワークユニットを使用します。MyCORBADebugワークユニットを作成する方法は、"B.1 CORBAワークユニット(MyCORBADebug)を作成するには"を参照してください。
実行資産のコピー
ビルドで生成された実行ファイルとダイナミックリンクライブラリを実行環境にコピーします。
ここでは、以下のようにコピーします。
ファイル:CALCSV.exe、USCALCSV.dll コピー先フォルダ:C:\Interstage\APS\var\CORBA_WU\MyCORBADebug
任意のフォルダにコピー可能ですが、このチュートリアルでは、MyCORBADebugのデフォルトのアプリケーション格納フォルダにコピーします。
CORBAサーバアプリケーションの配備
IJServerビューで右ボタンをクリックし、[Interstage管理コンソール]を選択します。Interstage Application Serverに未接続状態の場合には、Interstage Application Serverのコンテキストメニューから[接続/ログイン]を選択して、Interstage Application Serverに接続あるいはログインしてから[Interstage管理コンソール]を選択してください。
Interstage管理コンソールの左側のツリーから配備先のワークユニットを選択し、画面右側の[配備]タブを選択します。
インプリメンテーションリポジトリIDと実行プログラムファイルを指定します。
アプリケーション動作カレントディレクトリの作成
ワークユニットの起動で必要となるアプリケーション動作カレントディレクトリを作成します。
このチュートリアルでは、ワークユニット作成時にデフォルト値を使用しているため、以下のディレクトリを用意しておく必要があります。
C:\Interstage\APS\var\CORBA_WU\MyCORBADebug\work
インプリメンテーションリポジトリIDは、以下の形式で指定します。
IDL:モジュール名/インタフェース名:1.0
実行ファイル名は、最初にコピーしたEXEファイルを指定します。
詳細設定の[表示]を選択し、CORBAアプリケーションの[表示]を選択します。表示された詳細設定画面の[動作モード]で、[SYNC_END]を選択します。
インタフェース定義の[表示]を選択します。[追加]ボタンを押し、以下のようにインタフェースリポジトリID、ネーミングサービス登録名、ライブラリ名を指定します。
[一覧へ反映]ボタンを押した後、[配備]ボタンを押して、配備を行います。
ワークユニットの起動
配備時に起動指定で、[配備完了後、ワークユニットを起動する]をチェックしていない場合は、以下のようにして作成したワークユニットを起動します。
Interstage管理コンソールの左側のツリーからワークユニットを選択し、画面右側の[操作]タブを選択します。[起動]ボタンを押します。
アプリケーション動作カレントディレクトリが存在しない場合、起動時にエラーが発生します。アプリケーション動作カレントディレクトリは、ワークユニットの[環境設定]タブで確認できます。
クライアントアプリケーションの実行
クライアントアプリケーションを実行し、CORBAサーバアプリケーションにアクセスします。
クライアントアプリケーションの作成、実行方法の詳細については、"第14章 CORBAクライアントアプリケーション開発"を参照してください。
8. デバッグ
ワークベンチではCORBAワークユニット起動構成を使用することで、ワークベンチと同一端末にインストールされているInterstage Application Serverのワークユニット上で動作するCORBAサーバアプリケーションをデバッグできます。デバッグの手順の詳細については、"6.2 プロジェクトをデバッグする"を参照してください。