| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第5章 アプリケーションの開発(C++言語) | > 5.3 サーバアプリケーションのプログラミング(Portable Object Adapter:POA) | > 5.3.2 POA概要 |
POAオブジェクトを作成する際には、まず、POAポリシリストを作成する必要があります。次にポリシリストを指定してPOAオブジェクトを作成します。
POAオブジェクトの作成時に以下のPOAポリシを設定できます。
|
POAポリシ |
意味 |
Value |
Valueの説明 |
備考 |
|
ServantRetention: |
AOMテーブルをPOAオブジェクト内で持つか持たないかを指定します。つまり、POAオブジェクト内でインスタンス管理を行うかどうかを指定できます。 “リクエスト処理”参照。 |
RETAIN (注1) |
ActiveObjectMapにActiveなServantオブジェクトを憶えます。 |
|
|
NON_RETAIN |
ActiveObjectMapを使いません。 |
|||
|
RequestProcessing: |
リクエスト受信時に対象インスタンスをAOM内に持ってない、もしくはAOM自身を保持しないときの振る舞いを規定するポリシです。 “リクエスト処理”参照。 |
USE_ACTIVE_ |
リクエスト処理にActiveObjectMapだけ使用します。 |
|
|
USE_DEFAULT_ |
リクエストの処理をDefault Servantオブジェクトに任せます。 |
|||
|
USE_SERVANT_ |
ServantManagerオブジェクトによって目的のServantオブジェクトを見つけます。必要であればactivateも行われます。 |
|||
|
ImplicitActivation: |
Servantの活性化のモードを以下のように指定可能です。
|
IMPLICIT_ |
自動的にServantオブジェクトがactivateされます。 |
|
|
NO_IMPLICIT_ |
自動的にServantオブジェクトがactivateされません(サーバアプリケーションが明示的にServantオブジェクトを生成して、POAオブジェクトに登録します)。 |
|||
|
IdAssignment: |
オブジェクトIDをシステム(POAオブジェクト)が自動設定するか、ユーザが設定するかを指定できます。 “オブジェクトの活性化”参照。 |
SYSTEM_ID (注1) |
POAオブジェクトがオブジェクトIDを付けます。 |
|
|
USER_ID |
ユーザがオブジェクトIDを付けます。 |
|||
|
IdUniqueness: |
ServantにユニークなIDを付けるか、重複したIDを許すかの指定ができます。 |
UNIQUE_ID (注1) |
ServantオブジェクトにユニークなIDを付けます。 |
|
|
MULTIPLE_ID |
Servantオブジェクトに重複したIDを許します。 |
|||
|
Lifespan: |
トランジェントタイプのオブジェクトを扱うかパーシステントタイプのオブジェクトを扱うかを指定可能です。 |
TRANSIENT (注1) |
トランジェントタイプのオブジェクトを扱います(サーバlifespan = オブジェクトlifespan)。 |
PERSISTENTは指定不可 |
|
PERSISTENT |
パーシステントタイプのオブジェクトを扱います(サーバlifespan < オブジェクトlifespan)。 |
|||
|
Thread: |
スレッド処理をORBに任せるかシングルスレッドで動作させるかを指定できます。 |
ORB_CTRL_MODEL (注1) |
スレッド処理をORBに任せます。 |
このPOAポリシの設定値は無効(注2) |
|
SINGLE_THREAD_ |
シングルスレッドで動作させます。 |
注1) デフォルト値
注2) インプリメンテーションリポジトリ登録時のプロセス最大多重度(proc_conc_max)、スレッド初期多重度(thr_conc_init)の設定内容に依存します。
以下にPOAポリシの生成例を示します。
【例】
// POAポリシリスト作成
CORBA::PolicyList policies( 4 ); // POAのポリシリスト
CORBA::Environment env; // 例外情報
policies.length( 4 );
policies[0] = Poa->create_servant_retention_policy(
PortableServer::NON_RETAIN, env );
policies[1] = Poa->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
policies[2] = Poa->create_id_assignment_policy(
PortableServer::SYSTEM_ID, env );
policies[3] = Poa->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
注) ソース内のPoaはPOAクラスのインスタンス
POAオブジェクトを使用するためには、まずRootPOAオブジェクトを生成する必要があります。POAオブジェクトは、RootPOAオブジェクトをルートとして、子POAオブジェクトや孫POAオブジェクトを生成することでツリー構成とすることができます。RootPOAオブジェクトは、ORBがサーバの初期化時に生成します。RootPOAオブジェクトのPOAオブジェクトは以下のように取得することができます。
【例】
main( int argc, char* argv[] )
{
CORBA::ORB_ptr orb; // ORBのオブジェクトリフレンス
CORBA::Object_ptr obj; // オブジェクトリファレンスの格納域
CORBA::Environment env; // 例外情報
int current_argc = argc;
// ORBの生成と初期化
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
// RootPOAオブジェクトのオブジェクトリファレンスの取得
obj = orb->resolve_initial_references( "RootPOA", env );
// RootPOAオブジェクトのPOAオブジェクト獲得
PortableServer::POA_ptr rootPOA =
PortableServer::POA::_narrow( obj );
RootPOAオブジェクトには、以下のPOAポリシが設定されています。
ユーザアプリケーションで上記のPOAポリシを使用してインスタンス管理を行う場合は、RootPOAオブジェクトをそのまま使用することが可能です。しかし、新しいPOAオブジェクト(RootPOAオブジェクトの子孫POAオブジェクト)を生成し、固有のPOAポリシを設定することによりRootPOAオブジェクトとは異なるPOAポリシでインスタンス管理を行うことが可能となります。
新しいPOAオブジェクトを生成するには、すでに存在するPOAオブジェクト上でcreate_POA()メソッドを呼び出します。この結果、create_POA()を発行したPOAオブジェクトと新しく生成されたPOAオブジェクトは親子関係となります。アプリケーションで最初に生成するPOAオブジェクトはRootPOAオブジェクトであるため、その他のPOAオブジェクトはすべてRootPOAオブジェクトの子孫POAオブジェクトとなります。
create_POA()の引数としてPOAポリシリスト(Policyクラスの配列)を渡すことで、生成した子POAオブジェクトのポリシを設定することが可能です。
【例】
// 子POAオブジェクト(childPOA1)の生成
PortableServer::POA_ptr childPOA1
= rootPOA->create_POA( "poa_1", poamanager, policies1 );
// 孫POAオブジェクト(childPOA2)の生成
PortableServer::POA_ptr childPOA2
= childPOA1->create_POA( "poa_2", poamanager, policies2 );
注)ソース内のpoa_1,poa_2は生成するPOAの名前
ソース内のpoamanagerはPOAManagerクラスのインスタンス。
policies1, policies2はPolicyクラスのインスタンス。
上記のようにPOAオブジェクトは階層構造をもたせることが可能です。オブジェクトの生成、オブジェクトと管理するPOAオブジェクトとの関係については、“サーバアプリケーションと環境設定との関連付け”を参照してください。destroy()メソッドによりあるPOAオブジェクトが破棄された場合は、その子孫POAオブジェクトはすべて破棄されます。
ポリシリストに設定したPOAポリシの各設定値は、それらの組み合わせが妥当であるかどうかがcreate_POA()メソッド発行時にチェックされます。もし、設定値の組み合わせが妥当でない場合は、例外が発生します。
以下にPOAポリシの設定値の組み合わせを示します。妥当性欄で"*"の部分はこの値が設定された場合、create_POA()メソッド実行時にPortableServer::POA::InvalidPolicy例外が発生することを示しています。
なお、LifespanPolicyの設定値はTRANSIENTとしてください。また、ThreadPolicyの設定値は無視されます。
|
ポリシ |
Servant |
Request |
Implicit |
IdAssignment |
IdUniqueness |
妥当性 |
|
設定値 |
RETAIN |
USE_ACTIVE_ |
IMPLICIT_ |
SYSTEM_ID |
UNIQUE_ID |
|
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
− |
* |
||||
|
NO_IMPLICIT_ |
SYSTEM_ID |
UNIQUE_ID |
|
|||
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
UNIQUE_ID |
|
||||
|
MULTIPLE_ID |
|
|||||
|
USE_DEFAULT_ |
IMPLICIT_ |
SYSTEM_ID |
UNIQUE_ID |
* |
||
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
− |
* |
||||
|
NO_IMPLICIT_ |
SYSTEM_ID |
UNIQUE_ID |
* |
|||
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
UNIQUE_ID |
* |
||||
|
MULTIPLE_ID |
|
|||||
|
USE_SERVANT_ |
IMPLICIT_ |
SYSTEM_ID |
UNIQUE_ID |
|
||
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
− |
* |
||||
|
NO_IMPLICIT_ |
SYSTEM_ID |
UNIQUE_ID |
|
|||
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
UNIQUE_ID |
|
||||
|
MULTIPLE_ID |
|
|||||
|
NON_RETAIN |
USE_ACTIVE_ |
− |
− |
− |
* |
|
|
USE_DEFAULT_ |
− |
SYSTEM_ID |
UNIQUE_ID |
* |
||
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
UNIQUE_ID |
* |
||||
|
MULTIPLE_ID |
|
|||||
|
USE_SERVANT_ |
− |
SYSTEM_ID |
UNIQUE_ID |
|
||
|
MULTIPLE_ID |
|
|||||
|
USER_ID |
UNIQUE_ID |
|
||||
|
MULTIPLE_ID |
|
注) ServantRetentionPolicyにNON_RETAINが設定されている場合、ImplicitActivationPolicyの設定値は無視されます。
POAは、デフォルトのポリシ設定値として以下の値を持っています。
|
ポリシ |
デフォルト値 |
|
ServantRetention |
RETAIN |
|
RequestProcessing |
USE_ACTIVE_OBJECT_MAP_ONLY |
|
ImplicitActivation |
NO_IMPLICIT_ACTIVATION |
|
IdAssignment |
SYSTEM_ID |
|
IdUniqueness |
UNIQUE_ID |
|
Lifespan |
TRANSIENT |
|
Thread |
ORB_CTRL_MODEL |
create_POA()メソッドを使用して新しいPOAを生成する際は、デフォルトの設定値から変更したいポリシの設定だけを行うことが可能です。
以下の例ではRequestProcessingPolicyをUSE_DEFAULT_SERVANTに、IdUniquenessPolicyをMULTIPLE_IDに設定した子POAを生成しています。この場合、他のポリシの設定値は上記のデフォルトの設定値のままとなります。
【例】
CORBA::Environment env; // 例外情報
// POAポリシリスト作成
CORBA::PolicyList policies( 2 )
policies[0] = Poa->create_request_processing_policy(
PortableServer::USE_DEFAULT_SERVANT, env );
policies[1] = Poa->create_id_uniqueness_policy(
PortableServer::MULTIPLE_ID, env );
// 子POAオブジェクトの生成
PortableServer::POA_ptr Poa1
= Poa->create_POA( "poa_1", poamanager, policies );
注)ソース内のPoaはPOAクラスのインスタンス
ソース内のpoamanagerはPOAManagerクラスのインスタンス
なお、create_POA()メソッドの第3パラメタにnullを指定した場合には、生成される子POAのポリシはデフォルトの設定値となります。
目次
索引
![]()
|