3.2.3.2 特殊なケース

アプリケーションでTPフレームワークの標準的なサーバントの使い方を変更するには、2つのテクニックがあります。サーバントの取得に関するものとサーバントの破棄に関するものです。

アプリケーションでは、明示的な事前アクティブ化により、「取得」メカニズムを変更できます。この場合、アプリケーションはサーバントを作成して初期化してから、サーバントをアクティブ化された状態として宣言するようにTPフレームワークに要求します。こうしたサーバントは、TP::create_active_object_reference呼出しによってTPフレームワークに渡されると、その他のサーバントとまったく同じようにTPフレームワークによって扱われます。唯一の違いは、作成および初期化の方法です。

アプリケーションは、サーバントの破棄をTPフレームワークに任せるかわりに自身で処理することで、「破棄」メカニズムを変更できます。サーバントがServer::create_servantServerBase::create_servant_with_idまたはTP::create_active_object_referenceによってTPフレームワークに通知されると、TPフレームワークのデフォルト動作は、そのサーバント自体を削除することになります。この場合、アプリケーション・コードでは、非アクティブ化後にそのサーバントへのリファレンスを使用してはなりません。

ただし、アプリケーションからTPフレームワークに対して、TPフレームワークがサーバントを非アクティブ化した後にサーバントを破棄しないように指示することはできます。サーバントの処理は、サーバントのクラス全体について行うのではなく、サーバントを識別するパラメータを付けてTobj_ServantBase::_add_refを呼び出すことで、個別に行います。

ノート:

Oracle Tuxedoリリース8.0以降で作成するアプリケーションでは、TP::application_responsibility()メソッドのかわりにTobj_ServantBase::_add_refメソッドを使用します。TP::application_responsibility()メソッドと違い、add_ref()メソッドは引数を取りません。

サーバントの処理を行うアプリケーションの利点は、サーバントを新しく作成せずに済むことです。サーバントの取得に大きなコストが伴う場合、アプリケーションではサーバントを保存しておいて、後でそれを再利用すると便利です。特に便利なのは事前アクティブ化されたオブジェクトのサーバントの場合ですが、一般的にも言えることです。たとえば、TPフレームワークが次にServer::create_servantまたはServerBase::create_servant_with_idを呼び出した場合、アプリケーションは以前に保存しておいたサーバントを返すことができます。

また、アプリケーションがサーバントの処理を行うようにすると、アプリケーションは、サーバントが必要でなくなったとき、つまりほかのC++インスタンスと同じように、リファレンス数がゼロになったときに、Tobj_ServantBase::_remove_refを使用してサーバントを削除する必要があります。_remove_ref()メソッドの仕組みの詳細は、Tobj_ServantBase::_remove_ref()を参照してください。

シングル・スレッドおよびマルチスレッドのサーバー・アプリケーションの作成方法の詳細は、『CORBAサーバー・アプリケーションの作成』を参照してください。