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

5.13.3 POAオブジェクト

POAオブジェクトを作成する際には、まずPOAポリシリストを作成する必要があります。次に、ポリシリストを指定してPOAオブジェクトを作成します。


POAポリシ

POAオブジェクトの作成時に、以下のPOAポリシを設定できます。


POAポリシ

意味

Value

Valueの説明

備考

ServantRetention:
Servant関連付けポリシ

AOMテーブルをPOAオブジェクト内で持つか持たないかを指定します。つまり、POAオブジェクト内でインスタンス管理を行うかどうかを指定できます。
5.13.7 リクエスト処理”参照。

RETAIN (注1)

ActiveObjectMapにActiveなServantオブジェクトを憶えます。

  

NON_RETAIN

ActiveObjectMapを使いません。

RequestProcessing:
リクエスト処理ポリシ

リクエスト受信時に対象インスタンスをAOM内に持ってない、またはAOM自身を保持しないときの振る舞いを規定するポリシです。
5.13.7 リクエスト処理”参照。

USE_ACTIVE_
OBJECT_MAP_
ONLY (注1)

リクエスト処理にActiveObjectMapだけ使用します。

  

USE_DEFAULT_
SERVANT

リクエストの処理をDefault Servantオブジェクトに任せます。

USE_SERVANT_
MANAGER

ServantManagerオブジェクトにより目的のServantオブジェクトを見つけます。必要であれば、activateも行われます。

ImplicitActivation:
暗黙的活性化ポリシ

Servantの活性化のモードを以下のように指定可能です。

  • 自動的にServantがactivateされます。

  • 自動的にServantがactivateされません(アプリケーションが明示的にServantをPOAに登録します)。

5.13.8 暗黙的活性化(Implicit Activation)”参照。

IMPLICIT_
ACTIVATION (注1)

自動的にServantオブジェクトがactivateされます。

  

NO_IMPLICIT_
ACTIVATION

自動的にServantオブジェクトがactivateされません。サーバアプリケーションが明示的にServantオブジェクトを生成し、POAオブジェクトに登録します。

IdAssignment:
ID割り当てポリシ

オブジェクトIDをシステム(POAオブジェクト)が自動設定するか、ユーザが設定するかを指定できます。
USER_IDはアプリケーションで、オブジェクトIDに固有の意味を持たせたいときに有効です。
5.13.6 オブジェクトの活性化”参照。

SYSTEM_ID (注1)

POAオブジェクトがオブジェクトIDを付けます。

  

USER_ID

ユーザがオブジェクトIDを付けます。

IdUniqueness:
オブジェクトID一意性ポリシ

ServantにユニークなIDを付けるか、重複したIDを許すかを指定できます。
5.13.5 オブジェクトリファレンス、オブジェクトID、Servantオブジェクトの関連”参照。

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_
MODEL

シングルスレッドで動作させます。

注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オブジェクトの生成

RootPOAオブジェクト

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ポリシが設定されています。


ユーザアプリケーションで上記のPOAポリシを使用してインスタンス管理を行う場合は、RootPOAオブジェクトをそのまま使用することが可能です。しかし、新しいPOAオブジェクト(RootPOAオブジェクトの子孫POAオブジェクト)を生成して固有のPOAポリシを設定することにより、RootPOAオブジェクトとは異なるPOAポリシでインスタンス管理を行うことが可能となります。


子孫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
Retention

Request
Processing

Implicit
Activation

IdAssignment

IdUniqueness

妥当性

設定値

RETAIN

USE_ACTIVE_
OBJECT_MAP_
ONLY

IMPLICIT_
ACTIVATION

SYSTEM_ID

UNIQUE_ID

  

MULTIPLE_ID

  

USER_ID

*

NO_IMPLICIT_
ACTIVATION

SYSTEM_ID

UNIQUE_ID

  

MULTIPLE_ID

  

USER_ID

UNIQUE_ID

  

MULTIPLE_ID

  

USE_DEFAULT_
SERVANT

IMPLICIT_
ACTIVATION

SYSTEM_ID

UNIQUE_ID

*

MULTIPLE_ID

  

USER_ID

*

NO_IMPLICIT_
ACTIVATION

SYSTEM_ID

UNIQUE_ID

*

MULTIPLE_ID

  

USER_ID

UNIQUE_ID

*

MULTIPLE_ID

  

USE_SERVANT_
MANAGER

IMPLICIT_
ACTIVATION

SYSTEM_ID

UNIQUE_ID

  

MULTIPLE_ID

  

USER_ID

*

NO_IMPLICIT_
ACTIVATION

SYSTEM_ID

UNIQUE_ID

  

MULTIPLE_ID

  

USER_ID

UNIQUE_ID

  

MULTIPLE_ID

  

NON_RETAIN

USE_ACTIVE_
OBJECT_MAP_
ONLY

*

USE_DEFAULT_
SERVANT


()

SYSTEM_ID

UNIQUE_ID

*

MULTIPLE_ID

  

USER_ID

UNIQUE_ID

*

MULTIPLE_ID

  

USE_SERVANT_
MANAGER


()

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のポリシはデフォルトの設定値となります。