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ポリシリスト作成 org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[4]; policies[0] = Poa.create_servant_retention_policy( org.omg.PortableServer.ServantRetentionPolicyValue.NON_RETAIN ); policies[1] = Poa.create_request_processing_policy( org.omg.PortableServer.RequestProcessingPolicyValue.USE_DEFAULT_SERVANT ); policies[2] = Poa.create_id_assignment_policy( org.omg.PortableServer.IdAssignmentPolicyValue.SYSTEM_ID ); policies[3] = Poa.create_id_uniqueness_policy( org.omg.PortableServer.IdUniquenessPolicyValue.MULTIPLE_ID );
注) ソース内のPoa:POAクラスのインスタンス
■POAオブジェクトの生成
POAオブジェクトを使用するためには、まずRootPOAオブジェクトを生成する必要があります。POAオブジェクトは、RootPOAオブジェクトをルートとして、子POAオブジェクトや孫POAオブジェクトを生成することでツリー構成とすることができます。RootPOAオブジェクトは、ORBがサーバの初期化時に生成します。RootPOAオブジェクトのPOAオブジェクトは、以下のように取得します。
例
// ORBの生成と初期化 org.omg.CORBA.ORB Orb = org.omg.CORBA.ORB.init( args, null ); // RootPOAオブジェクトのオブジェクトリファレンスの取得 org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "RootPOA" ); // RootPOAオブジェクトのPOAオブジェクト獲得 org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow( _tmpObj );
RootPOAオブジェクトには、以下のPOAポリシが設定されています。
ServantRetentionPolicy: RETAIN
RequestProcessingPolicy: USE_ACTIVE_OBJECT_MAP_ONLY
ImplicitActivationPolicy: IMPLICIT_ACTIVATION
IdAssignmentPolicy: SYSTEM_ID
IdUniquenessPolicy: UNIQUE_ID
LifespanPolicy: TRANSIENT
ThreadPolicy: ORB_CTRL_MODEL
ユーザアプリケーションで上記の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オブジェクト(Poa1)の生成 orb.omg.PortableServer.POA Poa1 = rootPOA.create_POA("poa_1", poamanager, policies1); // 孫POAオブジェクト(Poa2)の生成 orb.omg.PortableServer.POA Poa2 = Poa1.create_POA("poa_2", poamanager, policies2);
注)ソース内のpoa_1、poa_2:生成するPOAの名前
ソース内のpoamanager:POAManagerクラスのインスタンス
policies1、policies2:Policyクラスのインスタンス
上記のように、POAオブジェクトは階層構造をもたせることが可能です。オブジェクトの生成、オブジェクトと管理するPOAオブジェクトとの関係については、“5.14 サーバアプリケーションと環境設定との関連付け”を参照してください。destroy()メソッドによりあるPOAオブジェクトが破棄された場合、その子孫POAオブジェクトはすべて破棄されます。
■POAポリシの設定値の組み合わせ
ポリシリストに設定したPOAポリシの各設定値は、それらの組み合わせが妥当であるかどうかがcreate_POA()メソッド発行時にチェックされます。もし、設定値の組み合わせが妥当でない場合は、例外が発生します。
POAポリシの設定値の組合せを以下に示します。妥当性欄で“*”の部分はこの値が設定された場合、create_POA()メソッド実行時にorg.omg.PortableServer.POAPackage.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ポリシのデフォルト設定値
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を生成する際は、デフォルトの設定値から変更したいポリシだけを設定することが可能です。
以下の例では、USE_DEFAULT_SERVANTにRequestProcessingPolicyを、MULTIPLE_IDにIdUniquenessPolicyを設定した子POAを生成しています。この場合、他のポリシの設定値は、上記のデフォルトの設定値のままとなります。
例
// POAポリシリスト作成 org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[2]; policies[0] = Poa.create_request_processing_policy( org.omg.PortableServer.RequestProcessingPolicyValue.USE_DEFAULT_SERVANT); policies[1] = Poa.create_id_uniqueness_policy( org.omg.PortableServer.IdUniquenessPolicyValue.MULTIPLE_ID ); // 子POAオブジェクトの生成 org.omg.PortableServer.POA newPOA = Poa.create_POA("poa_1", poamanager, policies);
注)ソース内のPoa:POAクラスのインスタンス
ソース内のpoamanager:POAManagerクラスのインスタンス
なお、create_POA()メソッドの第3パラメタにnullを指定した場合、生成される子POAのポリシはデフォルトの設定値となります。