ServantManagerオブジェクトは、リクエスト受信時にServantオブジェクトの生成/削除や検索を可能にする機能です。ServantManagerオブジェクトの各メソッドの実装は、ユーザ自身で作成します。作成したServantManagerオブジェクトは、POAオブジェクトに登録しておきます。
POAオブジェクトがリクエストを受信した際、AOMにオブジェクトIDが一致するServantオブジェクトが登録されていない場合に、POAオブジェクトはServantManagerオブジェクトのメソッドを呼び出し、Servantオブジェクトの生成/削除、検索を依頼します。
ServantManagerオブジェクトは、Servantオブジェクトの生成/削除を行うServantActivatorオブジェクトと、Servantオブジェクトを検索するServantLocatorオブジェクトの2種類が存在します。POAオブジェクトは、ServerRetentionポリシがRETAINの場合はServantActivatorオブジェクトを呼び出し、NON_RETAINの場合はServantLocatorオブジェクトを呼び出します。
作成するServantActivatorクラスは、以下のようにorg.omg.PortableServer.ServantActivatorクラスを継承させる必要があります。また、メソッドとしてincarnate()、etherealize()を実装している必要があります。
【ServantActivatorクラスの実装形式】
class UserServantActivator extends org.omg.CORBA.LocalObject implements org.omg.PortableServer.ServantActivator{ public org.omg.PortableServer.Servant incarnate(...) {...} public void etherealize(...) {...} }
POAオブジェクトは、Servantオブジェクトの生成を依頼する場合、ServantActivatorオブジェクトのincarnate()メソッドを呼び出し、Servantオブジェクトの削除を依頼する場合は、etherealize()メソッドを呼び出します。POAオブジェクトから渡されるパラメタは必要に応じて各メソッドの実装部で使用できます。
incarnate (Servantオブジェクト生成)
POAは、リクエスト受信時にAOMに対象のServantオブジェクトが未登録の場合にincarnate()メソッドを呼び出します。incarnate()メソッドは、POAオブジェクトにServantオブジェクトを生成させ返します。
org.omg.PortableServer.Servant incarnate( byte[] oid, org.omg.PortableServer.POA adapter ) oid : リクエスト対象のオブジェクトのオブジェクトID adapter: 呼び出し元のPOAオブジェクト
etherealize (Servantオブジェクト削除)
POAは、アプリケーションからdeactivate_object()メソッドが呼び出されたときに、etherealize()メソッドを呼び出します。POAオブジェクトが削除するServantオブジェクトをパラメタで指定します。etherealize()メソッドは、指定されたServantオブジェクトを削除します。
void etherealize( byte[] oid, org.omg.PortableServer.POA adapter, org.omg.PortableServer.Servant serv, boolean cleanup_in_progress, boolean remaining_activations ); oid : 削除対象のServantオブジェクトに対応するオブジェクトID adapter : 呼び出し元のPOAオブジェクト serv : 削除対象のServantオブジェクト cleanup_in_progress : POA.destoroy()から本メソッドが呼ばれた場合にtrue remaining_activations: 本メソッド呼出し時、常にfalse
ServantActivatorオブジェクトの具体的な処理の流れを以下に示します。
FactoryにServantのオブジェクトリファレンスの生成を依頼します。(注)
Factoryで生成したオブジェクトリファレンスをクライアントに返します。
Servantにオペレーションop()を要求します。
POAでは、AOMに未登録の要求であるためServantActivatorを呼び出します。
ServantActivatorでは、該当するServantを検索して返します。
ServantActivatorからServantを受け取り、AOMに登録します。
Servantに対してオペレーションop()の実行を依頼します。
オペレーションop()の結果をクライアントに通知します。
注) Factoryは、リクエストごとにオブジェクトリファレンスやインスタンスを作成するオブジェクトであり、インスタンス管理を行う場合に必要となるオブジェクトです。
作成するServantLocatorクラスは、以下のようにorg.omg.PortableServer.ServantLocatorクラスを継承させる必要があります。また、メソッドとしてpreinvoke()、postinvoke()を実装している必要があります。
【ServantLocatorクラスの実装形式】
class UserServantLocator extends org.omg.CORBA.LocalObject implements org.omg.PortableServer.ServantLocator{ public org.omg.PortableServer.Servant preinvoke(...) {...} public void postinvoke(...) {...} }
POAオブジェクトはクライアントからの要求を処理するため、毎回ServantLocatorオブジェクトのpreinvoke()メソッドを呼び出し、処理対象のServantオブジェクトを獲得します。POAオブジェクトはそのServantオブジェクトに処理を要求し、その処理が終わったら、ServantLocatorオブジェクトのpostinvoke()メソッドを呼び出し、ServantLocatorオブジェクトに後処理を依頼します。
POAオブジェクトから渡されるパラメタは、必要に応じて各メソッドの実装部で使用することができます。
preinvoke
POAオブジェクトは、処理を要求すべきServantオブジェクトを獲得するためにServantLocatorオブジェクトのpreinvoke()メソッドを呼び出します。preinvoke()メソッドは、POAオブジェクトにServantオブジェクトを返すと同時に、postinvoke()のための情報(cookie)も返します。
org.omg.PortableServer.Servant preinvoke( byte[] oid, org.omg.PortableServer.POA adapter, String operation, org.omg.PortableServer.ServantLocatorPackage.CookieHolder the_cookie ) oid : リクエスト対象のオブジェクトのオブジェクトID adapter : 呼び出し元のPOAオブジェクト operation : リクエスト対象のオペレーションの名前 the_cookie: Cookieオブジェクトを格納するためのCookieHolderオブジェクト
postinvoke
POAオブジェクトは、Servantオブジェクトの要求処理の終了直後にServantLocatorオブジェクトのpostinvoke()を呼び出します。その際に、preinvoke()との対応をとるため、preinvoke()で返されたcookieを指定します。
void postinvoke( byte[] oid, org.omg.PortableServer.POA adapter, String operation, java.lang.Object the_cookie, org.omg.PortableServer.Servant the_servant ); oid : リクエスト対象のオブジェクトのオブジェクトID adapter : 呼び出し元のPOAオブジェクト operation : リクエスト対象のオペレーションの名前 the_cookie : preinvokeで返されたCookieオブジェクト the_servant: リクエストに対する処理を行ったServantオブジェクト
ServantLocatorの具体的な処理の流れを以下に示します。
FactoryにServantのオブジェクトリファレンスの生成を依頼します。
Factoryで生成したオブジェクトリファレンスをクライアントに返します。
Servantにオペレーションop()を要求します。
POAでは、ServantLocatorを呼び出します。
ServantLocatorのpreinvoke()でServantを検索します。
Servantを受け取ります。
Servantに対してオペレーションop()の実行を依頼します。
オペレーションop()の結果をクライアントに通知します。
ServantLocatorのpostinvoke()を呼び出します。
クライアントへオペレーションを復帰します。