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

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コマンド使用例】
  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()メソッドを記述することが推奨されます。


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

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


【Visual C++(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のパラメタが必要となることがあります。