クライアントとのコネクションが切断された場合に、サーバアプリケーション側の不要なインスタンスを解放する方法について説明します。
この機能は、インスタンス管理機能を利用し、かつPOAがActiveObjectMapを使用してインスタンス管理を行っている場合にだけ利用できます。
Servantインスタンス解放用クラスのインスタンスを生成します。
生成したインスタンスを登録します。
クライアントとのコネクション切断が通知されます。
サーバントインスタンス解放の是非を問い合わせます。
サーバントインスタンスが不要である場合、AOMから削除します。
クライアントとのコネクション切断時にインスタンス解放を行うクラスを作成します。このクラスは、PortableServer::POAdisconnectクラスを継承して作成します。
クライアントとのコネクションが切断されたときに、作成したクラスのrelease_instance()メソッドが呼び出されます。親クラス(POAdisconnectクラス)のrelease_instance()メソッドは、常にfalse(解放しない)を返します。
release_instance()メソッドが呼び出されたとき、コネクションが切断されたクライアントが使用した、POA、ServantのインスタンスおよびオブジェクトIDがパラメタとして通知されます。オーバーライドされたrelease_instance()メソッドでは、これらの情報をもとにして、通知されたServantが必要なものであるかどうかを判断し、true(解放する)/false(解放しない)を返します。
trueの場合、暗黙的にPortableServer::ServantBase::servant_delete()メソッドが実行されます。対象のServantが実行中の場合、コネクションが切断されたクライアント以外のクライアントが対象のServantからのレスポンスを受け取った後に、そのServantのインスタンスが削除され、それ以降、そのServantへはアクセスできなくなります。
ユーザが作成したインスタンス解放クラスをPOAManagerに登録します。登録には、POAdisconnectクラスのstaticメソッドsetDisconnect()を呼び出します。
すでに登録したインスタンス解放クラスを変更または取り消す場合は、POAdisconnectクラスのstaticメソッドresetDisconnect()を呼び出します。