サーバアプリケーションは、初期化処理部とインタフェースの実装部分から構成されます。初期化処理部では、以下に示す処理を行います。
CORBAの初期化メソッドCORBA::ORB_init()を呼び出して、初期化処理を行います。結果として、ORBのオブジェクトリファレンスが返されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。
main ( int argc, char *argv[] ) { CORBA::ORB_ptr orb; // ORBのオブジェクトリファレンス CORBA::Environment env; // 例外情報 int current_argc = argc; env = new CORBA::Environment; orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
また、CORBA::ORB::BOA_init()の呼出しにより、基本オブジェクトアダプタの初期化処理を行います。
CORBA::BOA_ptr boa; // BOA用オブジェクトリファレンス boa = orb->BOA_init( current_argc, argv, CORBA_BOA_OAid, env );
なお、必要であれば、サーバアプリケーションの初期化処理も行います。
サーバアプリケーションの初期化が完了すると、ORBに対してその旨を通知します。ORBは、この命令が発行された時点で、クライアントからの要求をサーバアプリケーションに伝えます。活性化の方法は、サーバのタイプにより以下のように異なります。
サーバのタイプ | メソッド |
---|---|
shared server | CORBA::BOA::impl_is_ready |
unshared server | CORBA::BOA::obj_is_ready |
persistent server | CORBA::BOA::impl_is_ready |
(1)インプリメンテーションリポジトリのオブジェクトリファレンスの獲得
インプリメンテーションリポジトリのオブジェクトリファレンスを取り出します。メソッドのパラメタには、CORBA_ORB_ObjectId_ImplementationRepositoryを指定します。
(2)ImplementationDefオブジェクトのオブジェクトリファレンスの検索
FJ::ImplementationRep::lookup_id()を使用して、ImplementationDefオブジェクトのオブジェクトリファレンスを求めます。パラメタには、サーバアプリケーションのImplementationRepオブジェクトを指定します。
(3)サーバの活性化
CORBA::BOA::impl_is_ready()/CORBA::BOA::obj_is_ready()を使用して、サーバの活性化を行います。
サーバアプリケーションはプロセスで実装するかスレッドで実装するかにより、メソッドの動作が異なります。また、スレッドで実装する場合は、インプリメンテーションリポジトリ内に設定されている情報によっても異なります。動作の違いを以下に示します。
条件 | 動作 | |
---|---|---|
プロセスで実装 | OD_impl_instでmode=SYNC_END | メソッドは即時に復帰せず、このオブジェクトの停止がオペレータにより指示されたときに復帰します。(注) |
スレッドで実装 | OD_impl_instでmode=SYNC_END | 同上 |
OD_impl_instでmode=COMPATIBLE | メソッドは、即時に復帰します。 |
注) メソッドの復帰後は、初期化時にオープンしたファイルのクローズ処理/領域の解放処理などの非活性化処理を行う必要があります。詳細については、“4.2.1.4 サーバの非活性化”を参照してください。
注意
以下の条件のとき、CORBA::BOA::impl_is_ready()/CORBA::BOA::obj_is_ready()が復帰せずにサーバアプリケーションが終了します。
サーバアプリケーションをプロセスモードで作成している場合 かつ
サーバアプリケーションをCORBAワークユニット運用している場合 かつ
CORBAワークユニットを停止した場合
CORBA::BOA::impl_is_ready()/CORBA::BOA::obj_is_ready()の後に後処理を行う場合は、サーバアプリケーションをスレッドモードで作成するか、またはワークユニットの出口機能を利用してください。ワークユニットの出口機能に関しては、“OLTPサーバ運用ガイド”の“ワークユニットの出口機能”を参照してください。
CORBA::ImplementationDef_ptr impl; // インプリメンテーション情報検索用 ImplementationRep_ptr impl_rep; // ImplementationRepオブジェクトリファレンス CORBA::Object_ptr o; // オブジェクトリファレンスのポインタ // インプリメンテーション情報のオブジェクトリファレンス検索 o = orb->resolve_initial_references( CORBA_ORB_ObjectId_ImplementationRepository, env ); // ImplementationRepクラスへの変換 impl_rep = FJ::ImplementationRep::_narrow(o); // サーバのImplementationRepオブジェクトの検索 o = impl_rep->lookup_id( _IMPL_ODdemo_calculator, env ); // ImplementationDefクラスへの変換 impl = CORBA::ImplementationDef::_narrow(o); // サーバの活性化 boa->impl_is_ready( impl, env );
初期化処理の後、サーバアプリケーションで実装するインタフェースの処理を記述します。インタフェースを実装する方法として、以下の2種類があります。
implクラス方式
TIEクラス方式
派生クラスのメソッドとして実装する方法です。以下に特長を示します。
インタフェース実装クラスは、IDLコンパイラで生成されます。ユーザは、インタフェース実装クラスのメソッドとして、インタフェース実装関数だけを作成すればよいため、サーバアプリケーションの作成が容易です。
インタフェース実装クラスは、IDLコンパイラで生成されて固定化されるため、IDLに記述できない機能を追加できません。
テンプレートクラス機能を利用して実装する方法です。以下に特長を示します。
ユーザは、インタフェース実装クラスとそのメンバ関数としてのインタフェース実装関数を作成します。
インタフェース実装関数は、IDLコンパイラから生成されたTIEクラスを介して呼び出されます。
インタフェース実装クラスには、IDLで定義したインタフェース(クラス)のほか、任意の機能を同時に実装できます。
注意
TIEクラス方式を使用する場合は、IDLcコマンド実行時に-tieオプションを指定する必要があります。
それぞれの実装方法について、以下のIDL定義をもとに説明します。
なお、アプリケーションで使用可能なCORBAのデータ型については、“4.5 データ型に対するマッピング”を参照してください。
module ODdemo{ interface calculator{ exception ZEROPARAM {}; struct result { long add_result; long subtract_result; long multiple_result; float divide_result; }; result calculate( in long a, in long b ) raises( ZEROPARAM ); }; };
(1)implクラス方式
implクラスを使用する場合、以下を記述します。
インタフェース実装関数
インタフェース実装関数
インタフェース実装関数は、“モジュール名_インタフェース名_impl”という名前で定義されたインタフェース実装クラスのメンバ関数として実装します。
// IDLで生成されるヘッダ定義 class ODdemo_calculator_impl { public: ODdemo::calculator::result calculate( CORBA::Long, CORBA::Long, CORBA::Environment & ) throw ( CORBA::Exception ); } // インタフェースの実装 ODdemo::calculator::result // 復帰値の型 ODdemo_calculator_impl::calculate( // addメソッドの実装 CORBA::Long a, // 入力値 CORBA::Long b, // 入力値 CORBA::Environment & ) // エラー値 throw( CORBA::Exception ) { if( b == 0 ){ // 0除算チェック ODdemo::calculator::ZEROPARAM exc; throw( exc ); } ODdemo::calculator::result res; res.add_result = a+b; // 加算結果設定 res.subtract_result = a-b; // 減算結果設定 res.multiple_result = a*b; // 乗算結果設定 res.divide_result = (CORBA::Float)a/b; // 除算結果設定 return res; }
(2)TIEクラス方式
TIEクラスを使用する場合、以下を記述します。
インタフェース実装クラス
インタフェース実装関数
インタフェース実装クラス割当て関数
インタフェース実装クラス
インタフェース実装クラスには、以下の定義をpublic属性として含める必要があります。
デフォルトコンストラクタ
デストラクタ
オペレーション/アトリビュートの実装関数
オペレーションとアトリビュートの実装関数は、IDLコンパイラが生成するヘッダに定義されているインタフェースと同一の名前にします。ただし、“throw( CORBA::Exception )”は必要ありません。
その他のメンバ定義やクラス名は、適宜追加できます。
class CalculatorImpl { public: CalculatorImpl(); //コンストラクタの宣言 ~CalculatorImpl(); //デストラクタの宣言 ODdemo::calculator::result calculate ( //オペレーションの宣言 CORBA::Long a, CORBA::Long b, CORBA::Environment & ); };
インタフェース実装関数
インタフェース実装関数は、インタフェース実装クラスのメンバ関数として定義します。
デフォルトコンストラクタとデストラクタでは、特定の処理を記述する必要はありませんが、独自の処理を記述することもできます。
CalculatorImpl::CalculatorImpl() { } CalculatorImpl::~CalculatorImpl() { } ODdemo::calculator::result // 復帰値の型 CalculatorImpl::calculate( // メソッドの実装 CORBA::Long a, // 入力値 CORBA::Long b, // 入力値 CORBA::Environment & ) // エラー値 { if( b == 0 ){ // 0除算チェック ODdemo::calculator::ZEROPARAM exc; throw( exc ); } ODdemo::calculator::result res; res.add_result = a+b; // 加算結果設定 res.subtract_result = a-b; // 減算結果設定 res.multiple_result = a*b; // 減算結果設定 res.divide_result = (CORBA::Float)a/b; // 除算結果設定 return res; }
インタフェース実装クラス割当て関数
インタフェース実装クラス割当て関数は、インタフェース実装クラスを生成し、TIEクラスにインスタンスを設定します。この関数は、クライアントからリクエストを受け取ったときに自動的に呼び出され、インタフェース実装クラスのインスタンスが生成されます。
TIEクラスとインタフェース実装クラス割当て関数の名前は、以下のようになります。
_tie_インタフェース名
インタフェースクラス_ptr _ct_インタフェース名();
インスタンはデフォルトコンストラクタで生成する必要はなく、パラメタ付きのコンストラクタやoperator演算子などを利用して生成することもできます。TIEクラスにインスタンスを設定するためのコンストラクタは、1つに限定されいます。TIEクラスを割り当てるときは、引数として必ずインタフェース実装クラスのインスタンスを渡す必要があります。
ODdemo::calculator_ptr _ct_ODdemo_calculator() { CalculatorImpl *impl = new CalculatorImpl(); _tie_ODdemo_calculator<CalculatorImpl> *tie = new _tie_ODdemo_calculator<CalculatorImpl>(*impl); return tie; }
サーバアプリケーションは、利用者などからの停止要求を受けた場合、クライアントからの要求を以降受け付けない旨をORBに対して通知します。ORBはこの通知を受けて、サーバアプリケーションにクライアントからの処理要求を伝えず、クライアントに例外を返します。非活性化の方法は、サーバタイプにより以下のように異なります。
サーバのタイプ | メソッド |
---|---|
shared server | CORBA::BOA::deactivate_impl |
unshared server | CORBA::BOA::deactivate_obj |
persistent server | CORBA::BOA::deactivate_impl |
deactivate_implでは、サーバアプリケーションのImplementationRepオブジェクトをパラメタとして指定します。deactivate_objでは、オブジェクトリファレンスをパラメタとして指定します。
boa->deactivate_impl( impl, env ); // サーバの非活性化
なお、ワークユニット運用している場合は、isstopwuコマンドやInterstage管理コンソールから停止操作が実行されることにより、クライアントからの要求を以降受け付けない旨をORBに対して通知します。そのため、アプリケーション側で非活性化用のメソッドを発行する必要はありません。
ワークユニット運用でないCORBAアプリケーションの場合も、odcntlqueコマンドでサーバアプリケーションを終了する場合は、アプリケーション側で非活性化用のメソッドを発行する必要はありません。