| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第5章 アプリケーションの開発(C++言語) | > 5.3 サーバアプリケーションのプログラミング(Portable Object Adapter:POA) | > 5.3.1 インスタンス管理とアプリケーション形態 |
サーバアプリケーションは、Servant(インタフェース実装部)のインスタンスの管理方法により以下の4つの形態をとることができます。
以下のように要件によりアプリケーション形態を選択してください。


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

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とは、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()オペレーションの実装として記述する必要があります。
(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オブジェクトのインスタンスも通常のServantオブジェクトのインスタンスと同様に、POAに登録する必要があります。
“Active Object Map(AOM)使用例 (Factory-1方式)”や“Servant Activator使用例 (Factory-2方式)”等に示した例では、Factoryオブジェクトは「Factory専用のPOA」を使用してDefault Servantとして登録しています。加えてFactory用のPOAはAOMを使用しない設定(NON_RETAINポリシ)としています。
これは以下の理由によるものです。
目次
索引
![]()
|