Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(C++言語)> 5.3 サーバアプリケーションのプログラミング(Portable Object Adapter:POA)> 5.3.1 インスタンス管理とアプリケーション形態

5.3.1.1 アプリケーション形態の種別

  サーバアプリケーションは、Servant(インタフェース実装部)のインスタンスの管理方法により以下の4つの形態をとることができます。
 以下のように要件によりアプリケーション形態を選択してください。

 Factoryはリクエストごとにオブジェクトリファレンスやインスタンスを作成するオブジェクトであり、インスタンス管理を行う場合に必要となるオブジェクトです。
 AOMはActive Object Mapのことであり、インスタンスの管理テーブルのことです。
 AOM、ServantManager等の詳細については、“POA概要”を参照してください。
 Factory-1方式およびFactory-2方式の各クライアントは以下のように、クライアントごとに異なるServantのインスタンスを使用します。

[Factory-1方式とFactory-2方式の違い]

 Factory-1方式はFactory内で事前にインスタンスを作成しておくことができるため、リクエストを受信した時点でインスタンスを作成するFactory-2より性能的には若干優れます。
 Factory-2方式はリクエストを受信した時点でインスタンスを作成するので、Factory内で事前のインスタンスを作成しておくFactory-1より資源的には若干優れます。

 アプリケーション形態は、Servantオブジェクトの属するPOAオブジェクトのServantRetentionポリシ、RequestProcessingポリシの指定により決まります。組み合わせ方を以下に示します。詳細については、“POAオブジェクト”を参照してください。

アプリケーション形態

ServantRetentionポリシ

RequestProcessingポリシ

デフォルトインスタンス方式

NON_RETAIN

USE_DEFAULT_SERVANT

Factory-1方式

RETAIN

任意

Factory-2方式

RETAIN

USE_SERVANT_MANAGER

ユーザインスタンス管理方式

NON_RETAIN

USE_SERVANT_MANAGER

注) 表内のポリシは、Servantオブジェクトを管理するPOAポリシに対する設定値を示しています。

[Factoryについて]

 Factoryとは、Servantオブジェクトのインスタンスを生成し、そのオブジェクトリファレンスをクライアントに返すことを目的としたインタフェースです。
 これにより、そのクライアントが専用で使用できるServantオブジェクトのインスタンスをサーバ側に持たせることが可能となります。
 Factoryの概念は、以下のIDL定義によって示されます。前述したFactory-1方式、Factory-2方式を使用する際も、IDL定義で他のインタフェースとともにFactoryインタフェースを定義します。

【FactoryのIDL定義例(a)】

  //何らかのインタフェース
    interface intf{
        void  op(); 
    };
  //Factoryインタフェース
    interface Factory {
        intf   create();
    };

 上記のIDL定義で示されるように、クライアントはFactoryオブジェクトのオペレーションcreate()を発行することにより、そのクライアントで使用するintfオブジェクトを取得することが可能となります。
 次にクライアントは取得したintfオブジェクトに対し、op()オペレーションを発行することで本来の目的の処理を行います。

 一方サーバ側では、以下の一連の処理をcreate()オペレーションの実装として記述する必要があります。

  1. Servantオブジェクト(intfインタフェースの実装クラスのインスタンス)を生成(new)します。
  2. 生成したインスタンスとオブジェクトリファレンスとの関連付けをPOAのAOMに登録します。
  3. 関連付けられたオブジェクトリファレンスを返します。

 (Factory-2方式ではcreate()オペレーションの実装として3のオブジェクトリファレンスの生成と復帰だけを行い、1と2は要求時にServantManagerオブジェクト内で行います。しかし、クライアント側から見たcreate()オペレーションの機能は同じです)。

 Factoryとは、このようなインタフェースの機能上の概念です。したがって、IDL定義では、Factoryインタフェースの名前(上記の例では"Factory")や実装するオペレーションの名前(上記の例では"create")、種類は自由です。しかし、Factoryの目的上、上記のcreate()のような「戻り値としてオブジェクトリファレンスを返す」機能をもつオペレーションが最低限必要となります。

 実際のアプリケーション開発では、生成したServantオブジェクトのインスタンスを解放するためのオペレーションもFactoryに実装することが推奨されます。これによりサーバ資源の節約が可能となります。
 以下のIDL定義の例ではServantオブジェクトのインスタンスを解放するためのオペレーションとしてdestroy()を定義しています。

【FactoryのIDL定義例(b)】

  //何らかのインタフェース
    interface intf{
        void  op(); 
    };
  //Factoryインタフェース
    interface Factory{
        intf  create();
        void  destroy(in intf obj);
    };

 クライアント側では目的の処理が終了した時点で、以前にcreate()メソッドで取得したオブジェクトリファレンスを引数としてdestroy()オペレーションをコールします。一方、サーバ側では渡されたオブジェクトリファレンスに対応するServantオブジェクトをAOMから削除する処理を行います。

 上記のIDLに対するFactoryオブジェクトのcreate()オペレーション、destoroy()オペレーションの実装例を以下に示します。ここでは、intfインタフェースの実装クラスをUserServantクラスとしています。処理の詳細については、“POA概要”以降を参照してください。

【オペレーションの実装例(Factory-1方式)】

      intf_ptr  Factory_impl::create( CORBA::Environment&  env )
                throw( CORBA::Exception )
      {
          intf_ptr       ior; // Servantオブジェクトのオブジェクトリファレンス
          try {
              // 1 Servantオブジェクトの生成
              intf_impl* svt = new intf_impl();
              // 2 AOMへ登録
              poa->activate_object( svt, env );
              // 3オブジェクトリファレンスの生成
              CORBA::Object_var _tmpObj = poa.servant_to_reference( svt, env ); 
              // intf型に変換
              ior = intf::_narrow( _tmpObj ); 
          }
          catch( CORBA::SystemException&  e ) {  /*例外処理*/  }
          return( ior ); 
      }

void  Factory_impl::destroy( intf_ptr obj,
CORBA::Environment&  env )
throw( CORBA::Exception )
{
          try {
              // オブジェクトリファレンスからオブジェクトIDを求める
              PortableServer::ObjectId_var  oid = poa->reference_to_id( obj, env ); 
              // オブジェクトIDからServantを求める
              PortableServer::Servant  svt = poa->id_to_servant( *oid, env );
              // Servantをdeactiveにする(AOMより削除)
              poa->deactivate_object( *oid, env );
              // Servantの削除
              svt->servant_delete();
          }
          catch( CORBA::SystemException&  e ) {  /*例外処理*/  }
      }

注) ソース上のpoaはPOAオブジェクトのインスタンス

[Factoryオブジェクトのインスタンスの扱いについて]

 Factoryオブジェクトのインスタンスも通常のServantオブジェクトのインスタンスと同様に、POAに登録する必要があります。
 “Active Object Map(AOM)使用例 (Factory-1方式)”や“Servant Activator使用例 (Factory-2方式)”等に示した例では、Factoryオブジェクトは「Factory専用のPOA」を使用してDefault Servantとして登録しています。加えてFactory用のPOAはAOMを使用しない設定(NON_RETAINポリシ)としています。
 これは以下の理由によるものです。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005