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

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クラスを経由するため、オブジェクトの参照が増加します。これにより多少のオーバヘッドがありえます。