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()メソッドを記述することが推奨されます。
POAアプリケーションを作成する場合、以下のような設定を行う必要があります。
![]()
【Visual C++(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のパラメタが必要となることがあります。