CORBAの初期化メソッドCORBA::ORB.init()を呼び出し、初期化処理を行います。本メソッドの結果として、ORBのオブジェクトリファレンスが通知されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。
int main( int argc, char* argv[] ) { CORBA::ORB orb; // ORB用オブジェクトリファレンス CORBA::Environment env; // 例外情報 try { // ORBの生成と初期化 ob = CORBA::ORB.init( current_argc, argv, FJ_OM_ORBid, env ); ... } catch( CORBA::Exception& e ) { ... // 例外処理 } }
例外処理try-catchについては、“4.5.2 クライアントアプリケーションの例外処理”を参照してください。
サーバアプリケーションでPOAオブジェクトを使用するために、イニシャルサービスのオブジェクトリファレンスの取出しメソッドresolve_initial_references()によりRootPOAのオブジェクトリファレンスを求めます。
try { // RootPOAのオブジェクトリファレンスの取得 CORBA::Object_ptr _tmpObj = orb->resolve_initial_references( "RootPOA", env ); // RootPOAのPOAオブジェクト獲得 PortableServer::POA_ptr rootPOA = PortableServer::POA::_narrow( _tmpObj ); } catch( CORBA::Exception& e ) { ... // 例外処理 }
RootPOAとは、異なるポリシでインスタンスを管理する場合や、インタフェースごとなど、複数のPOAにインスタンスの管理を分散させたい場合は、新しいPOAを生成します。
以下の例では、取得したRootPOAのメソッドを使用して、子POAを作成しています。
create_POA()の第1パラメタには、アダプタ名(生成するPOAの名前)を指定します。アダプタ名は、任意の文字列(Stringオブジェクト)を指定します。“4.3.3 サーバアプリケーションと環境設定との関連付け”で示すように、インプリメンテーションリポジトリID/インタフェースリポジトリIDを指定することも可能です。
create_POA()の第3パラメタのポリシには、アプリケーション形態にあったポリシリストを指定します。この例では、USE_DEFAULT_SERVANTを使用するPOAを作成しています。
CORBA::PolicyList policies( 4 ); // ポリシリスト CORBA::Environment env; // 例外情報 try { // ポリシリスト作成 policies.length( 4 ); policies[0] = rootPOA->create_servant_retention_policy( PortableServer::NON_RETAIN, env ); policies[1] = rootPOA->create_request_processing_policy( PortableServer::USE_DEFAULT_SERVANT, env ); policies[2] = rootPOA->create_id_assignment_policy( PortableServer::SYSTEM_ID, env ); policies[3] = rootPOA->create_id_uniqueness_policy( PortableServer::MULTIPLE_ID, env ); // インタフェースリポジトリID に対応するのPOAオブジェクト獲得 PortableServer::POA_ptr POA1 = rootPOA->create_POA( "childPOA", rootPOA->the_POAManager(), policies, env ); } catch( CORBA::Exception& e ) { ... // 例外情報 }
孫以下のPOAを作成する場合も上記と手順は、同じです。子POAのインスタンス(上記の例の場合:POA1)上でcreate_POA()メソッドを発行することにより、孫POAを生成することが可能です。
注意
POAのアダプタ名(上記例では“childPOA”)に、日本語などのマルチバイト文字は使用できません。
IDLコンパイラで生成されたスケルトン(以下参照)内に定義してあるPOA_xxxクラス(xxx:<モジュール名>_<インタフェース名>)を継承したxxx_implクラス(xxx:<モジュール名>_<インタフェース名>)内のオペレーションの実装を記述します。オペレーションのC++マッピング後のシグネチャは、yyy.hファイル(yyy:IDLファイル名)内の記述を参照することでわかります。
yyy_skel.cpp
yyy:IDLファイル名
yyy_skel_c++.C
yyy:IDLファイル名
注意
この実装方法は、継承方式(Inheritance-Based Implementation)に基づくものです。代理方式(Delegation-Based Implementation)を使用する場合は、“4.3.5 サーバアプリケーションの実装アプローチ”を参照してください。
module ODsample{ interface intf{ long add( in long a, in long b ); }; };
class POA_ODsample_intf : public virtual PortableServer::ServantBase { : }; class ODsample_intf_impl : public virtual POA_ODsample_intf { public : CORBA::Long add( ... ); : };
CORBA::Long Odsample_intf_impl::add( CORBA::Long a, CORBA::Long b, CORBA::Environment& env ) throw( CORBA::Exception ) { return( a + b ); }
Servantオブジェクトを生成し、POAのAOMに登録します。以下の例では、RootPOAのAOMにServantオブジェクトを登録しています。 servant_to_reference()メソッドを使用することで、Servantオブジェクトを登録すると同時に対応するオブジェクトリファレンスを生成・獲得しています(POAがIMPLICIT_ACTIVATIONポリシを持つ場合)。
try { // Servantの生成 ODsample_intf_impl* svt = new ODsample_intf_impl(); // AOMにServantを登録(活性化),オブジェクトリファレンス取得 CORBA::Object_ptr c_obj = rootPOA->servant_to_reference( svt, env ); } catch( CORBA::SystemException& e ) { ... // 例外処理 }
生成したオブジェクトリファレンスをネーミングサービスへ登録します。OD_or_admコマンドでオブジェクトリファレンスの事前生成/登録を行っている場合は、必要ありません。
#include "CosNaming_cplus.h" : CORBA::Environment env; // 例外情報 : try { // ネーミングサービスのオブジェクトリファレンスの取得 CORBA::Object_ptr obj = orb->resolve_initial_references( "NameService", env ); // NamingContext型に変換 CosNaming::NamingContext_ptr cos_naming = CosNaming::NamingContext::_narrow( obj ); CosNaming::Name name; name.length( 1 ); name[0]->id = ( const CORBA::Char* )"ODsample::intf"; name[0]->kind = ( const CORBA::Char* )""; try { cos_naming->unbind( name, env ); //同名の古いオブジェクトリファレンスがあれば削除 } catch( CORBA::Exception& e ) { : } cos_naming->bind( name, env ); //オブジェクトリファレンスの登録 } catch( CORBA::Exception& e ) { ... //例外処理 }
“4.3.4.6 ネーミングサービスへの登録”の例では、アプリケーション内でオブジェクトリファレンスの生成とネーミングサービスへの登録を行っていますが、OD_or_admコマンドを使用することで、事前にオブジェクトリファレンスの生成/登録を行うことが可能となります。この場合、アプリケーション内での生成/登録は不要です。POA構成は、「POA構成方法2」/「POA構成方法4」を使用することになります。
例
OD_or_adm -c IDL:ODsample/intf:1.0 -a Imple_sample1 -n ODsample::sample1
指定されたインタフェースリポジトリIDでオブジェクトリファレンスを登録します。
指定されたインプリメンテーションリポジトリIDでオブジェクトリファレンスを登録します。
ネーミングサービスに登録するオブジェクト名を指定します。
POAに関連付けられたPOAManagerのactivate()を発行することで、クライアントからの受信待ち状態となります。activate()発行直後に、ORBクラスのrun()メソッドを発行します。これにより、サーバアプリケーションは終了せず待機状態となります。
try { // POAマネージャのactivate PortableServer::POAManager_ptr poa_manager; poa_manager = rootPOA->the_POAManager( env ); poa_manager->activate(); orb->run( env ); } catch( CORBA::Exception& e ) { ...//例外処理 }
注意
動作上、activate()発行時に終了待機状態となるため、run()メソッドには制御は移りません。このため、run()メソッドは機能的には何も行いません。しかし、アプリケーションの可搬性の面からrun()メソッドを記述することが推奨されます。
注意
以下の条件のとき、POAManagerのactivate()が復帰せずにサーバアプリケーションが終了します。
サーバアプリケーションをプロセスモードで作成している場合 かつ
サーバアプリケーションをCORBAワークユニット運用している場合 かつ
CORBAワークユニットを停止した場合
POAManagerのactivate()の後に後処理を行う場合は、サーバアプリケーションをスレッドモードで作成するか、またはワークユニットの出口機能を利用してください。ワークユニットの出口機能に関しては、“OLTPサーバ運用ガイド”の“ワークユニットの出口機能”を参照してください。
POAアプリケーションを作成する場合、以下のように設定する必要があります。
【Microsoft(R) Visual Studio(R)の場合】
「プロジェクトの設定」の「プリプロセッサの定義」に“_MULTI_LINK_”を追加します。
プロジェクトに“xx_stub.cpp”(xx:IDLファイル名)を追加してビルドします。
【Makefileでnmakeを使用する場合】
コンパイラオプションに“_MULTI_LINK_”を追加します。
“xx_stub.cpp”(xx:IDLファイル名)を追加してコンパイルし、ビルドします。
コンパイラオプションに“_MULTI_LINK_”を追加します。
“xx_stub_c++.C”(xx:IDLファイル名)を追加してコンパイルし、ビルドします。
注意
コンパイラにg++を使用する場合、プログラミング例では省略されていることがありますが、メソッドによっては引数にCORBA::Environmentのパラメタが必要となることがあります。