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

第5章 アプリケーションの開発(C++言語)> 5.3 サーバアプリケーションのプログラミング(Portable Object Adapter:POA)> 5.3.2 POA概要

5.3.2.3 POAオブジェクト

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

POAポリ

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

POAポリシ

意味

Value

Valueの説明

備考

ServantRetention:
Servant関連付けポリシ

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

リクエスト処理”参照。

RETAIN (注1)

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

 

NON_RETAIN

ActiveObjectMapを使いません。

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

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

リクエスト処理”参照。

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に登録します)。

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

IMPLICIT_
ACTIVATION (注1)

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

 

NO_IMPLICIT_
ACTIVATION

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

IdAssignment:
ID割り当てポリシ

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

オブジェクトの活性化”参照。

SYSTEM_ID (注1)

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

 

USER_ID

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

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

ServantにユニークなIDを付けるか、重複したIDを許すかの指定ができます。

オブジェクトリファレンス、オブジェクト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ポリシリスト作成
  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オブジェクトは、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オブジェクトを生成するには、すでに存在する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ポリシの設定値の組み合わせ

 ポリシリストに設定したPOAポリシの各設定値は、それらの組み合わせが妥当であるかどうかがcreate_POA()メソッド発行時にチェックされます。もし、設定値の組み合わせが妥当でない場合は、例外が発生します。
 以下にPOAポリシの設定値の組み合わせを示します。妥当性欄で"*"の部分はこの値が設定された場合、create_POA()メソッド実行時にPortableServer::POA::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を生成する際は、デフォルトの設定値から変更したいポリシの設定だけを行うことが可能です。
 以下の例では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のポリシはデフォルトの設定値となります。


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

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