ページの先頭行へ戻る
Interstage Application Server V12.3.0 アプリケーション作成ガイド(CORBAサービス編)
FUJITSU Software

4.3.4 静的スケルトンインタフェース

静的起動インタフェースを使用する場合のサーバアプリケーションの処理の流れを以下に示します。



4.3.4.1 初期化

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 クライアントアプリケーションの例外処理”を参照してください。


4.3.4.2 RootPOAのオブジェクトリファレンスの獲得

サーバアプリケーションで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 ) {
    ... // 例外処理
}

4.3.4.3 子孫POAの作成

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”)に、日本語などのマルチバイト文字は使用できません。


4.3.4.4 インタフェースの実装

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 サーバアプリケーションの実装アプローチ”を参照してください。


IDL定義】
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 );
}

4.3.4.5 AOMへの登録(活性化)

Servantオブジェクトを生成し、POAのAOMに登録します。以下の例では、RootPOAのAOMにServantオブジェクトを登録しています。 servant_to_reference()メソッドを使用することで、Servantオブジェクトを登録すると同時に対応するオブジェクトリファレンスを生成・獲得しています(POAがIMPLICIT_ACTIVATIONポリシを持つ場合)。


Servantオブジェクトのインスタンス生成とAOMへの登録】
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 ) {
    ...  // 例外処理
}

4.3.4.6 ネーミングサービスへの登録

生成したオブジェクトリファレンスをネーミングサービスへ登録します。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.7 オブジェクトリファレンスの事前生成/登録

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

-c IDL:ODsample/intf:1.0

指定されたインタフェースリポジトリIDでオブジェクトリファレンスを登録します。

-a Imple_sample1

指定されたインプリメンテーションリポジトリIDでオブジェクトリファレンスを登録します。

-n ODsample::sample1

ネーミングサービスに登録するオブジェクト名を指定します。


4.3.4.8 POAManagerの活性化と終了待機

POAに関連付けられたPOAManagerのactivate()を発行することで、クライアントからの受信待ち状態となります。activate()発行直後に、ORBクラスのrun()メソッドを発行します。これにより、サーバアプリケーションは終了せず待機状態となります。


POAManagerの活性化】
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サーバ運用ガイド”の“ワークユニットの出口機能”を参照してください。


4.3.4.9 アプリケーション作成時の注意点

POAアプリケーションを作成する場合、以下のように設定する必要があります。


Microsoft(R) Visual Studio(R)の場合】

  1. 「プロジェクトの設定」の「プリプロセッサの定義」に“_MULTI_LINK_”を追加します。

  2. プロジェクトに“xx_stub.cpp”(xx:IDLファイル名)を追加してビルドします。

【Makefileでnmakeを使用する場合】

  1. コンパイラオプションに“_MULTI_LINK_”を追加します。

  2. “xx_stub.cpp”(xx:IDLファイル名)を追加してコンパイルし、ビルドします。


  1. コンパイラオプションに“_MULTI_LINK_”を追加します。

  2. “xx_stub_c++.C”(xx:IDLファイル名)を追加してコンパイルし、ビルドします。


注意


コンパイラにg++を使用する場合、プログラミング例では省略されていることがありますが、メソッドによっては引数にCORBA::Environmentのパラメタが必要となることがあります。