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

4.3.5 サーバアプリケーションの実装アプローチ

  静的スケルトンインタフェースを使用したサーバアプリケーションの実装上のアプローチとして、「継承方式」「代理方式」の2つの方式が存在します。ここでは、これら2つの実装方式とその特徴について説明します。


4.3.5.1 継承方式と代理方式

継承方式Inheritance-Based Implementation

  新規にサーバアプリケーションを作成する場合に使用する、一般的な実装方法です。サーバアプリケーションでスケルトンのメソッドを実装します。POAに対してはスケルトンのクラス自身を登録します。


代理方式Delegation-Based Implementation

  ユーザが開発した既存のクラス等をServantとして使用したい場合に有効な方法です。スケルトンを継承し、かつPOAの登録対象となるServantとしてtieクラスが用意されます(IDLコンパイラによりtemplate<class T> POA_<interface名>_tieクラスが生成されます)。
  ユーザが作成したインタフェース実装クラスのインスタンスはtieクラス内のメンバオブジェクトとして登録します。オペレーションの起動はいったんtieクラスを経由して登録したクラスのインスタンスに対して発行されます。



4.3.5.2 継承方式のServant実装

  継承方式によるServantは、以下のような継承関係となります。サーバアプリケーションのメイン部では、このServantをPOAに登録します。



  上図のとおり、継承方式ではServantは以下のようにスケルトンクラスを継承する形式で実装します。

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{
        :
      CORBA::Long add( 
        CORBA::Long a
        CORBA::Longint b
        CORBA::Environment& = CORBA::Environment() )
        throw( CORBA::Exception );
                  :
  };
【サーバアプリケーションでの実装例】
  CORBA::Long  ODsample_intf_impl::add{
      return( a + b );
  }

  メイン処理部では、スケルトンクラスをPOAに登録します。以下の例ではDefault Servantとして登録しています。

【メイン部の例】
  // Servantの生成
  ODsample_intf_impl* svt = new ODsample_intf_impl();
  // Default Servantに設定
  aPOA->set_servant( svt );

) aPOAはPOAクラスのインスタンス


4.3.5.3 代理方式のServant実装

  代理方式によるユーザクラス(インタフェース実装クラス)は、以下のような継承関係で実装します。サーバアプリケーションのメイン部では、tieクラス(POA_<インタフェース名>_tie)のインスタンスをPOAに登録します。継承方式を使用した場合のような規定の継承関係から解放されるため、実装の自由度が高くなります。ただし、tieクラスのメンバとして登録するために、インタフェース実装クラスをtieクラスと関連付ける必要があります。代理方式のアプリケーション例は、“4.3.7 サーバアプリケーションのプログラミング例”を参照してください。



  上図のとおり、代理方式では、ユーザクラスは以下のようにPOA_<interface名>tieインタフェースを実装するように記述します。

IDL定義】
  module ODsample{
      interface   intf{
          long    add(in long a, in long b);
      };
  };
【スケルトンクラス】
    class POA_ODsample_intf : public virtual PortableServer::ServantBase
    {
         :
    }
    template <class T>
    class POA_ODsample_intf_tie : public virtual POA_ODsample_intf
    {
            :
        CORBA::Long  add( CORBA::Long  a,
                      CORBA::Long  b,
                      CORBA::Environment  &_env = CORBA::Environment() )
                      throw( CORBA::Exception ) { return _ptr->add( _env ); }
            :
  };
【ユーザクラスの例】
  class UserClass
  {
    public :
      CORBA::Long add(
                CORBA::Long a,
                CORBA::Long b,
                CORBA::Environment&env )
                throw( CORBA::Exception )
    {
        return( a + b );
    }
  };

  メイン処理部では、いったんこのユーザクラスのインスタンスをtieクラスのインスタンスに登録します(tieクラスのコンストラクタの引数としてユーザクラスインスタンスを渡します)。さらに、tieクラスのインスタンスをPOAにServantとして登録します。以下の例ではDefault Servantとして登録しています。

【メイン部の例】
  // ユーザクラスのインスタンス生成
  UserClass*  uc = new UserClass();
  // ユーザクラスとtieオブジェクトの関連付け
  POA_ODsample_intf_tie< UserClass >*  svt = new POA_ODsample_intf_tie< UserClass >( uc );
  // Default Servantに設定
  aPOA->set_servant( svt ); 

) aPOAはPOAクラスのインスタンス


4.3.5.4 継承方式と代理方式の比較

  継承方式、代理方式の特徴を以下の表に示します。
  サーバアプリケーションの設計で、どちらの実装方式を使用するかはユーザの選択に任されます。

  

継承方式

代理方式

主な用途

新規開発

既存資産の利用

実装の自由度

小さい。
ServantにはIDLc が生成する実装クラスを指定し、実装クラスは他のクラスを継承することができないため

大きい。
ユーザが定義するインタフェース実装クラスはtieクラスとの関連付けに必要なインタフェース部分以外に関して、自由に作成することができます。

コーディングの複雑さ

比較的簡潔となります。

複雑になりやすい。

性能

オペレーションの起動に必要なスケルトン機能はServant自身に継承されているため、比較的よい。

オペレーションの起動はtieクラスを経由するため、オブジェクトの参照が増加します。これにより多少のオーバヘッドがありえます。