3.7.3.7.5 説明

このメソッドを使用すると、現在実行されているオブジェクト(オブジェクトを呼び出したメソッドの終了時)、または別のオブジェクトを非アクティブ化することができます。このメソッドは、プロセス・バウンド・アクティブ化ポリシーが設定されたオブジェクトに対してのみ使用できます。このメソッドにより、processアクティブ化ポリシーが設定されたオブジェクトをさらに柔軟に扱うことができます。

ノート:

シングル・スレッド・サーバーの場合、TP::deactivateEnable(interface, object id, servant)メソッドを使用すると、オブジェクトを非アクティブ化できます。ただし、オブジェクトがトランザクションに参加している場合、オブジェクトが非アクティブ化されるのは、トランザクションがコミットまたはロールバックしたときです。トランザクションがコミットまたはロールバックする前にオブジェクトに対して呼出しが行われた場合、オブジェクトは非アクティブ化されません。必要な動作が確実に実行されるようにするには、オブジェクトがトランザクションに参加していないことを確認するか、TP::deactivateEnable()を呼び出してからトランザクションが終了するまでオブジェクトに対して呼出しが行われないようにします。

マルチスレッド・サーバーでは、オブジェクトごとのサーバーでオブジェクトを非アクティブにするためのTP::deactivateEnable(interface, object id, servant)メソッドの使用はサポートされません。このメソッドは、リクエストごとのサーバーでのオブジェクトの非アクティブ化ではサポートされますが、他のスレッドがオブジェクトを操作しているために非アクティブ化が遅延することがあります。

呼び出されるオーバーロード関数の種類によって、操作は次のようになります:

Current-object format
プロセス・アクティブ化ポリシーを設定されたオブジェクトのメソッド内から呼び出された場合、現在実行中のオブジェクトは、メソッドの実行が終了した後に非アクティブ化されます。
メソッド・アクティブ化が設定されたオブジェクトのメソッド内から呼び出された場合、こうしたオブジェクトの通常の動作(事実上のNOOP)と同じ効果があります。
オブジェクトが非アクティブ化されると、TPフレームワークではまずアクティブ・オブジェクト・マップからオブジェクトが削除されます。次に、理由コードDR_METHOD_ENDを使用して、オブジェクトに関連付けられたサーバントのdeactivate_objectメソッドが呼び出されます。
Any-object format
アプリケーションでは、ObjectIdと関連付けられたサーバントを指定することで、オブジェクトの非アクティブ化をリクエストします。
オブジェクトが現在実行中の場合、TPフレームワークでは非アクティブ化対象としてオブジェクトをマークして、current-object形式と同様に、オブジェクトのメソッドが終了するまで待機してから非アクティブ化します。オブジェクトが実行中でない場合、TPフレームワークでは直ちにオブジェクトを非アクティブ化できます。非アクティブ化のステータスは、呼出し側に通知されません。オブジェクトが非アクティブ化されると、TPフレームワークではまずアクティブ・オブジェクト・マップからオブジェクトが削除されます。次に、理由コードDR_EXPLICIT_DEACTIVATEを使用して、オブジェクトに関連付けられたサーバントのdeactivate_objectメソッドが呼び出されます。

非アクティブ化をリクエストされたオブジェクトにtransactionアクティブ化ポリシーが設定されていた場合、IllegalOperation例外が発生します。これは、こうしたオブジェクトを非アクティブ化すると、Oracle Tuxedoトランザクション・マネージャからのトランザクション終了の通知と競合する場合があるからです。