bea ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > Tuxedo > Tuxedo CORBA プログラミング・リファレンス > TP フレームワーク |
Tuxedo CORBA プログラミング・リファレンス
|
Tobj_ServantBase::deactivate_object()
概要
オブジェクト ID とサーバントとの関連付けを削除します。このメソッドを使用すると、アプリケーションでは、オブジェクトが非活性化される前にオブジェクトの状態のすべてまたは一部を保存できます。状態は、共用メモリ、通常のフラット・ファイル、またはデータベース・ファイルに保存できます。
C++ バインディング
class Tobj_ServantBase : public PortableServer::ServantBase {
public:
virtual void deactivate_object(const char* stroid,
TobjS::DeactivateReasonValue reason) {}
};
引数
注記 このリリースでは、オブジェクト ID の長さに関する制約がなくなりました。
説明
オブジェクトの非活性化は、CORBA オブジェクトのインプリメンテーションに設定されている活性化方針に従って、システムまたはアプリケーションによって開始されます。deactivate_object() メソッドは、CORBA オブジェクトが非活性化される前に呼び出されます。これらの方針および使い方については、「ICF の構文」を参照してください。
CORBA オブジェクトのインプリメンテーションの活性化方針が method の場合にクライアントによって呼び出されるメソッド、または活性化方針が transaction の場合にトランザクションの処理が終わったときに呼び出されるメソッドの実行後に、非活性化が発生する場合もあります。また、活性化方針が transaction または process の場合に、サーバがシャットダウンされると発生します。
さらに、BEA Tuxedo ソフトウェアでは、process または method が設定された CORBA オブジェクトを、TP::deactivateEnable() および TP::deactivateEnable(-,-,-) メソッドによってユーザ側で制御して非活性化することができます。TP::deactivateEnable をオブジェクトのメソッド内で呼び出すと、メソッドの終了時にそのオブジェクトが非活性化されます。transaction 活性化方針が設定されたオブジェクトで TP::deactivateEnable を呼び出すと、例外 (TobjS::IllegalOperation) が発生し、TP フレームワークは何の処理も行いません。process 活性化方針が設定されたオブジェクトに対して TP::deactivateEnable(-,-,-) を呼び出すと、そのオブジェクトは非活性化されます。詳細については、TP::deactivateEnable()を参照してください。
注記 サーバのシャットダウン時には、アクティブ・オブジェクト・マップに残っているすべてのオブジェクトに対して deactivate_object メソッドが呼び出されます。オブジェクトが AOM に追加される方法としては、TP フレームワークによって暗黙的に追加される場合 (オンデマンド活性化手法。TP::create_servant とサーバントの activate_object メソッド) と、ユーザが TP::create_active_object_reference を使用して明示的に追加する方法があります。
プログラマは、activate_object() および deactivate_object() メソッドとクライアントが明示的に呼び出すメソッドを使用して、オブジェクトの状態を管理できます。これらのメソッドを使用してオブジェクトの状態を管理する方法は、アプリケーションのニーズによって異なります。これらのメソッドの使い方については、『BEA Tuxedo CORBA サーバ・アプリケーションの開発方法』を参照してください。
transaction 活性化方針が設定された CORBA オブジェクトでは、DR_TRANS_COMMITTING 理由コードで deactivate_object() メソッドが呼び出されたときに、トランザクションの結果に関して判断できます。このメソッドは、Current.rollback_only() メソッドを呼び出すことで、トランザクションをロールバックさせることができます。そうでない場合は、2 フェーズ・コミット・アルゴリズムが続行されます。トランザクションは、Current.rollback_only() がこのメソッドで呼び出されなかったという理由以外でもコミットされないことがあります。トランザクションに関与するその他の CORBA オブジェクトまたはリソース・マネージャも、トランザクションのロールバックを支持できます。
制約
このメソッドが呼び出されたときにオブジェクトがトランザクションに関与している場合、オブジェクトが呼び出された理由に基づいて、実行可能な処理が制約されます。オブジェクトがトランザクションに関与していた場合、活性化方針が transaction で、呼び出しの reason コードは以下のいずれかです。
こうした制約がある理由は、トランザクション・バウンドの活性化方針を設定されたオブジェクトの非活性化が、トランザクションのトランザクション・マネージャから TP フレームワークに対する呼び出しによって制御されるからです。reason コード DR_TRANS_COMMITTING で呼び出しが行われた場合、トランザクション・マネージャは 2 フェーズ・コミットのフェーズ 1 (準備) を実行しています。この段階では、トランザクションを一時停止する呼び出し、または新しいトランザクションを開始する呼び出しを行うことはできません。別のプロセス内の CORBA オブジェクトを呼び出すにはそのプロセスがトランザクションに参加する必要があり、トランザクション・マネージャは既に準備フェーズを実行しているので、この呼び出しを行うとエラーが発生します。
1. トランザクションに関与していない CORBA オブジェクトを呼び出すには、そのトランザクションを一時停止する必要があるので、これもエラーの原因となります。同じことは tpcall() にもあてはまります。
同じように、reason コード DR_TRANS_ABORTED での呼び出しが行われた場合、トランザクション・マネージャは既にアボート中です。トランザクション・マネージャがアボート中の場合、トランザクションを一時停止したり、新しいトランザクションを開始したりすることはできません。この制約は、DR_TRANS_COMMITTING に関しても適用されます。
戻り値
特にありません。
例外
クライアントによって呼び出される CORBA オブジェクト・メソッドで例外が発生した場合、TP フレームワークが例外をキャッチして、最終的にクライアントに返します。これは、deactivate_object() を呼び出して例外が発生した場合にもあてはまります。
クライアントには、deactivate_object() で発生した例外について通知されません。アプリケーション・コードでは、格納されている CORBA オブジェクトの状態が矛盾していないかどうかをチェックする必要があります。たとえば、アプリケーション・コードで、deactivate_object() がオブジェクトの状態を正しく保存したかどうかを示す永続性フラグを保存すると便利です。このフラグを activate_object() でチェックします。
deactivate_object() の実行中にエラーが発生した場合、アプリケーション・コードでは、CORBA 標準例外または DeactivateObjectFailed 例外を生成する必要があります。deactivate_object() が TP フレームワークで呼び出されると、TP フレームワークは例外をキャッチして、以下のイベントが発生します。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |