目次 前 次 PDF


TPフレームワーク

TPフレームワーク
このトピックには次の項が含まれます:
単純なプログラミング・モデルこの項では、次の内容について説明します。
状態管理。この項では、次の内容について説明します。
トランザクション。この項では、次の内容について説明します。
Oracle Tuxedo CORBA TPフレームワークでは、ユーザーが高パフォーマンスのTPアプリケーション用のサーバーを作成することを可能にするプログラミングTPフレームワークを提供します。この章では、TPフレームワークのプログラミング・モデルおよびアプリケーション・プログラミング・インタフェース(API)について詳しく説明します。このAPIの使用方法は、『CORBAサーバー・アプリケーションの作成』でも説明しています。
Oracle Tuxedo CORBAサーバーを開発する場合、TPフレームワークは必須です。この要件は今後のリリースで緩和される予定ですが、多くの場合、TPフレームワークはアプリケーションの主要な構成部分として使用されると考えられます。
Oracle Tuxedoは、ロード・バランシング、トランザクション機能、および管理インフラストラクチャを提供するためのインフラストラクチャを提供します。TPフレームワークで使用されるベースAPIは、Oracle拡張機能を伴うCORBA APIです。TPフレームワークのAPIは、カスタマに公開されます。Oracle Tuxedo ATMIは、TPフレームワークのAPIと混在させることができるオプションのAPIであり、このAPIを使用すると、CORBAサーバーとATMIサーバーが混在する環境で分散アプリケーションをデプロイできます。
Oracle Tuxedo CORBAよりも前においては、ORB製品は大規模環境でのOracle Tuxedoのパフォーマンスに対応していませんでした。Oracle Tuxedoシステムは、1秒当たり数百のトランザクションを処理できるアプリケーションをサポートしています。このようなアプリケーションは、各リクエストで使用するシステム・リソース量を最小化し、したがってスループットおよびプライス・パフォーマンスを最大化する、Oracle Tuxedoのステートレス・サービス・プログラミング・モデルを使用してビルドされます。
現在では、Oracle Tuxedo CORBAとそのTPフレームワークによって、Oracle Tuxedo ATMIアプリケーションと同等のパフォーマンスを持つCORBAアプリケーションを開発できます。Oracle Tuxedo CORBAサーバーは、CORBAプログラミング・モデルを使用しながら、Oracle Tuxedoステートレス・サービス・プログラミング・モデルに近いスループット、レスポンス時間、およびプライス・パフォーマンスを実現します。
単純なプログラミング・モデル
TPフレームワークでは、単純で便利なCORBAオブジェクトの様々な実装のサブセットを選択できます。これは、サーバー側オブジェクトの実装を開発する場合にのみ使用します。クライアント側CORBA ORBを使用する場合、クライアントは、TPフレームワークによって管理されるサーバー側実装を持つCORBAオブジェクトと対話します。クライアントは、TPフレームワークの存在を認識しません。非Oracle Tuxedoサーバー環境で実行されるCORBAオブジェクトにアクセスするように作成されたクライアントは、クライアント・インタフェースに対する変更や制約なく、Oracle Tuxedoサーバー環境で実行される同じCORBAオブジェクトにアクセスできます。
TPフレームワークでは、CORBAポータブル・オブジェクト・アダプタ(POA)よりも使用と理解が簡単で、特にエンタープライズ・アプリケーション向けに準備されたサーバー環境およびAPIが提供されます。これは単純なサーバー・プログラミング・モデルであり、ORBIXやVisiBrokerなどのORBを使用していたプログラマにとっては一般的な通常のCORBAモデルの実装となります。
TPフレームワークを使用すると、次の方法でサーバー環境の複雑さを抑えて、Oracle Tuxedo CORBAサーバーのプログラミングが容易になります。
TPフレームワークには、次の機能があります。
制御フロー
TPフレームワークは、ORBおよびPOAと連携して、次の方法でアプリケーション・プログラムのフローを制御します。
オブジェクト状態管理
TPフレームワークAPIには、アプリケーション・コードにCORBAオブジェクトの柔軟な状態管理スキームを実装するためのコールバック・メソッドが用意されています。状態管理には、オブジェクトを非アクティブ化したりアクティブ化するときのオブジェクトの状態を保存および復元する処理が含まれます。状態管理は、サーバーのパフォーマンスおよびリソース使用量に影響を与える、アクティブ化されたオブジェクトの有効期間にも関係します。アクティブ化されたオブジェクトのデフォルトの有効期間は、IDLのコンパイル時に実装に割り当てたポリシーによって制御されます。
トランザクションの統合
TPフレームワークのトランザクション統合には次の機能があります。
オブジェクトのハウスキーピング
TPフレームワークでは、サーバーの停止時に、サーバーが関与しているすべてのトランザクションがロールバックされ、アクティブ化されているすべてのCORBAオブジェクトが非アクティブ化されます。
高レベルのサービス
TPフレームワークAPIのTPインタフェースには、オブジェクトの登録とユーティリティ関数を実行するメソッドが用意されています。次のサービスが提供されます。
こうした高レベル・サービスのメソッドは、開発者がCORBA POA、CORBAネーミング・サービス、およびOracle Tuxedo APIを理解しなくても、基礎となる実装として使用できるようにすることを目的としています。基礎となるAPI呼出しを高レベルのメソッドのセットと一緒にカプセル化することで、プログラマは、より複雑な基本機能を理解したり使用することなく、ビジネス・ロジックの実現に集中することが可能となります。
状態管理
状態管理には、オブジェクトを非アクティブ化したりアクティブ化するときのオブジェクトの状態を保存および復元する処理が含まれます。状態管理は、サーバーのパフォーマンスおよびリソース使用量に影響を与える、アクティブ化されたオブジェクトの有効期間にも関係します。TPフレームワークの外部APIには、activate_objectおよびdeactivate_objectメソッドが用意されています。これらのメソッドは、状態管理コードを配置可能な場所を示します。
アクティブ化ポリシー
TPフレームワークでは、状態管理はアクティブ化ポリシーによって提供されます。このポリシーは、サーバントの作成および破棄ではなく、特定のIDLインタフェースに対するサーバントのアクティブ化および非アクティブ化を制御します。このポリシーは、TPフレームワークを使用するCORBAオブジェクトにのみ適用されます。
アクティブ化ポリシーは、CORBAオブジェクトがメモリー内でアクティブ化されるデフォルトの期間を決定します。CORBAオブジェクトがPOA内でアクティブ化されるのは、POAのアクティブ・オブジェクト・マップにオブジェクトIDと既存のサーバントを関連付けるエントリが含まれている場合です。オブジェクトを非アクティブ化すると、オブジェクトIDとアクティブ化されたサーバントとの関連付けが削除されます。選択できるアクティブ化ポリシーは、method (デフォルト)、transactionまたはprocessのいずれかです。
注意:
各アクティブ化ポリシーの内容は次のとおりです。
method (これはデフォルトのアクティブ化ポリシーです。)
CORBAオブジェクトのアクティブ化、つまりオブジェクトIDとサーバントとの関連付けは、メソッドが終了するまで維持されます。メソッドが終了すると、オブジェクトは非アクティブ化されます。オブジェクト参照で次のメソッドが呼び出されると、CORBAオブジェクトはアクティブ化されます(オブジェクトIDが新しいサーバントに関連付けられます)。この動作は、Oracle Tuxedoのステートレス・サービスと似ています。
CORBAオブジェクトのアクティブ化、つまりオブジェクトIDとサーバントとの関連付けは、トランザクションが終了するまで維持されます。トランザクション中は、オブジェクトの複数のメソッドを呼び出すことができます。オブジェクトは最初のメソッド呼出しの前にアクティブ化され、次のいずれかの方法で非アクティブ化されます。
transactionアクティブ化ポリシーでは、2フェーズ・コミット・アルゴリズムを実行する前に、オブジェクトがトランザクションの結果に関して支持するかどうかを判断できます。オブジェクトがトランザクションのロールバックを支持する場合は、Tobj_ServantBase::deactivate_objectメソッドのCurrent.rollback_only()を呼び出します。トランザクションのコミットを支持する場合は、Current.rollback_only()を呼び出しません。
注意:
これは、Oracle Tuxedoの会話型サービスに似たリソース割当てモデルです。ただし、このモデルの方が、システム・リソースの使用量が少ないという点で、Oracle Tuxedoの会話型サービスよりもコストが小さくなります。この理由は、Oracle Tuxedo ORBのマルチコンテキスト・ディスパッチ・モデル、つまり、1つのサーバー用のサーバントがメモリー内に同時に多数存在するモデルを使用しているからです。このモデルでは、多数のクライアントにサービスし、同時にアクティブ化されている多数のサーバントが1つのサーバー・プロセスを共有できます。Oracle Tuxedoシステムでは、プロセスは、会話の有効期間だけ1つのクライアント専用となり、1つのサービスにのみ割り当てられます。
CORBAオブジェクトは、非アクティブ化状態で呼び出されたときにアクティブ化され、デフォルトではプロセスが終了するまでその状態を持続します。
注意:
アプリケーション制御のアクティブ化および非アクティブ化
通常、アクティブ化と非アクティブ化の決定は、この章で前述したようにTPフレームワークで行われます。この項のテクニックは、代替メカニズムの使用方法を示します。アプリケーションは、特定のポリシーを持つオブジェクトのアクティブ化と非アクティブ化のタイミングを明示的に制御できます。
明示的なアクティブ化
アプリケーション・コードでは、processアクティブ化ポリシーを使用するオブジェクトに関して、TPフレームワークのオン・デマンド・アクティブ化機能を無効にすることができます。アプリケーションでは、TP::create_active_object_reference呼出しを使用して、オブジェクトを「事前アクティブ化」、つまり呼出しの前にアクティブ化することができます。
事前アクティブ化のしくみは次のとおりです。アプリケーションは、オブジェクト参照を作成する前に、サーバントをインスタンス化して、その状態を初期化します。アプリケーションはTP::create_active_object_referenceを使用して、オブジェクトをアクティブ・オブジェクト・マップに追加、つまりサーバントとObjectIdを関連付けます。最初の呼出しが行われると、TPフレームワークが、オブジェクト参照を作成したプロセスに直ちにリクエストを転送してから、既存のサーバントに転送します。この際、オブジェクトに対する2番目以降の呼出しと同じように、Server::create_servantに次いでサーバントのactivate_objectメソッドを呼び出す必要はありません。こうしたオブジェクトのオブジェクト参照は別のサーバーを指さないので、アクティブ化されている限り、オブジェクトがオン・デマンドでアクティブ化されることはありません。
事前アクティブ化されたオブジェクトにはprocessアクティブ化ポリシーが設定されているため、(1)プロセスの終了または(2) TP::deactivateEnable呼出しのいずれかのイベントが発生するまで、オブジェクトはアクティブ化されたままとなります。
使用上の注意
事前アクティブ化は、アプリケーションが共有メモリーなどを使用して状態を初期化して、初期状態のサーバントを同じプロセスで確立する必要がある場合に特に有用です。状態にポインタ、オブジェクト参照または複雑なデータ構造が含まれている場合、後で別のプロセスで状態が初期化されるまで待機する処理は非常に難しくなるためです。TP::create_active_object_referenceを使用すると、事前アクティブ化されたオブジェクトは、事前アクティブ化を実行したコードと必ず同じプロセスにあります。事前アクティブ化によってリソースがあらかじめ割り当てられるので、便利な手法であっても、事前アクティブ化を多用することは控える必要があります。ただし、必要に応じて適切に使用すれば、事前アクティブ化はその他の方法よりもはるかに効率的です。
適切な使用方法の例として、イテレータ・パターンを使用するオブジェクトがあります。たとえば、database_queryメソッドから電話帳の内容のような長い項目リストが無制限IDLシーケンスで返される可能性があるとします。メッセージ・サイズやメモリー要件が非常に大きくなるため、このような項目をすべてシーケンスで返すことは実際的ではありません。
イテレータ・パターンを使用するオブジェクトは、リストを取得する最初の呼出しで、一定数の項目をシーケンスで返し、さらに要素を取得する場合に呼び出すことができるイテレータ・オブジェクトへの参照も返します。イテレータ・オブジェクトは初期オブジェクトによって初期化されます。つまり、初期オブジェクトはサーバントを作成してその状態を設定し、反復処理が長い項目リストのどの位置で止まっているか(データベース、問合せパラメータ、カーソルなどを指すポインタ)を追跡します。
初期オブジェクトは、TP::create_active_object_referenceを使用してこのイテレータ・オブジェクトを事前にアクティブ化します。また、そのオブジェクトへのオブジェクト参照を作成してクライアントに戻します。クライアントは、イテレータ・オブジェクトを繰り返し呼び出して、たとえば毎回リスト内の次の100項目を受信します。この状況での事前アクティブ化の利点は、状態を複雑化できることです。多くの場合、初期オブジェクトに制御があるときに、そのコンテキスト(呼出しフレーム)にすべての情報を含むメソッドからこのような状態を最初に設定することが最も簡単です。
クライアントでは、イテレータ・オブジェクトの操作を終了すると、初期オブジェクトで最終メソッドを呼び出して、イテレータ・オブジェクトを非アクティブ化します。初期オブジェクトは、TP::deactivateEnableメソッドを呼び出すイテレータ・オブジェクトのメソッドを呼び出すことで、イテレータ・オブジェクトを非アクティブ化します。つまり、イテレータ・オブジェクトは、TP::deactivateEnableを自身に対して呼び出します。
注意事項
通常、この方法で事前アクティブ化されたオブジェクトについては、クラッシュが発生すると状態を回復できません。(最初の遅延アクティブ化で設定するには、状態が複雑すぎるか、不便であると考えられるためです。)これは、基本的にオブジェクトが1回のアクティブ化期間についてのみ有効であることを示しており、有効なオブジェクトのテクニックです。
ただし、1回かぎりという使用方法のために問題が発生する場合があります。その状態を含むプロセスにつながるオブジェクト参照をクライアントが依然として保持し、かつ、クラッシュした後はその状態を再度作成できないため、クライアントの次回の呼出しによって、自動的にオブジェクトが新しくアクティブ化されないように注意を払う必要があります。そのようなオブジェクトの状態は適切でなくなるためです。
この問題を解決する方法は、オブジェクトがTPフレームワークによって自動的にアクティブ化されないようにすることです。activate_object呼出しの結果としてTobjS::ActivateObjectFailed例外をTPフレームワークに提供した場合、TPフレームワークはアクティブ化を実行せず、CORBA::OBJECT_NOT_EXIST例外をクライアントに返します。クライアントにはイテレータ(または類似)パターンについての知識があるので、こうした状況について想定しています。クライアントは反復を再起動するように準備する必要があります。
注意:
将来、TPフレームワーク自体でオブジェクト参照が有効ではなくなったことを検出できるようになれば、このような防御的な措置は必要なくなります。特に、activate_objectメソッドが呼び出される可能性を考慮する必要がなくなります。TPフレームワークが変更される場合、activate_objectは呼び出されず、フレームワーク自体がOBJECT_NOT_EXIST例外を生成するようになります。
自己非アクティブ化
processアクティブ化ポリシーを設定したオブジェクトを事前アクティブ化できるように、processアクティブ化ポリシーを設定したオブジェクトを非アクティブ化するようリクエストすることもできます。事前アクティブ化する機能と非アクティブ化を要求する機能は独立しています。つまり、オブジェクトがどのようにアクティブ化されたかに関係なく、オブジェクトを明示的に非アクティブ化することができます。
アプリケーションのメソッドは、TP::deactivateEnableを使用して、オブジェクトを非アクティブ化するようにリクエストできます。TP::deactivateEnableを呼び出して、オブジェクトが非アクティブ化された場合、CORBAオブジェクトに対する以降の呼出しによって、以前にアクティブ化されたように、同じプロセスで再度アクティブ化されるとはかぎりません。ObjectIdとサーバントとの関連付けは、CORBAオブジェクトがアクティブ化されてから、サーバー・プロセスが停止されるか、アプリケーションがTP::deactivateEnableを呼び出すまで持続します。関連付けが解除された後、オブジェクトをもう一度呼び出すと、Oracle Tuxedo構成パラメータで許可された場所で再度アクティブ化することができます。
TP::deactivateEnableには2つの形式があります。最初の形式(パラメータなし)では、実行中のオブジェクトは、呼出しが行われたメソッドの終了後に非アクティブ化されます。非アクティブ化するかどうかはオブジェクト自身が決定します。通常、この非アクティブ化は、「サインオフ」シグナルとして機能するメソッド呼出しで行われます。
2番目の形式のTP::deactivateEnableでは、サーバーは、オブジェクトが実行中かどうかにかかわりなく、アクティブ化されている任意のオブジェクトを非アクティブ化するようリクエストできます。つまり、どのサーバーもオブジェクトを非アクティブ化するよう要求できます。この形式では、非アクティブ化するオブジェクトを識別するパラメータを指定します。transactionアクティブ化ポリシーが設定されたオブジェクトを明示的に非アクティブ化することはできません。トランザクションが終了するまで、そうしたオブジェクトを安全に非アクティブ化することができないからです。
TP::deactivateEnable呼出しで、TPフレームワークはサーバントのdeactivate_objectメソッドを呼び出します。TPフレームワークがdeactivate_objectを呼び出す正確なタイミングは、非アクティブ化されるオブジェクトの状態によって異なります。オブジェクトが実行中でない場合、TPフレームワークは、制御が呼出し側に戻る前に、オブジェクトを非アクティブ化します。オブジェクトが実行中の場合もあります。これは常にパラメータを持たないTP::deactivateEnable の場合です。この形式では、実行中のオブジェクトが参照されるからです。この場合、TP::deactivateEnableには、オブジェクトが直ちに非アクティブ化されたかどうか通知されません。
注意:
TP::deactivateEnable(interface, object id, servant)メソッドを使用すると、オブジェクトを非アクティブ化できます。ただし、オブジェクトがトランザクションに参加している場合、オブジェクトが非アクティブ化されるのは、トランザクションがコミットまたはロールバックしたときです。トランザクションがコミットまたはロールバックする前にオブジェクトに対して呼出しが行われた場合、オブジェクトは非アクティブ化されません。
必要な動作が確実に実行されるようにするには、オブジェクトがトランザクションに参加していないことを確認するか、TP::deactivateEnable()を呼び出してからトランザクションが終了するまでオブジェクトに対して呼出しが行われないようにします。
サーバントの存続期間
サーバントとは、IDLインタフェースの操作を実装するメソッドを格納したC++クラスのことです。ユーザーはサーバントのコードを記述します。TPフレームワークは、サーバント・コードのメソッドを呼び出してリクエストを満たします。サーバントは、C++のnew文で作成され、C++のdelete文で破棄されます。この項では、作成と削除の実行者、および作成と削除のタイミングについて説明します。
通常のケース
通常、TPフレームワークはサーバントの存続期間を完全に制御します。基本的なモデルとしては、アクティブ化されていないオブジェクトに対するリクエストが到着すると、TPフレームワークがサーバントを取得した後、activate_objectメソッドを呼び出してサーバントをアクティブ化します。非アクティブ化する場合、TPフレームワークはサーバントのdeactivate_objectメソッドを呼び出してから、サーバントを破棄します。
TPフレームワークがサーバントを取得するフェーズは、TPフレームワークが、サーバントを作成する必要がある場合に、ユーザー作成のサーバー・メソッド、Server::create_servantまたはServerBase::create_servant_with_idを呼び出す、ということです。このとき、アプリケーション・コードはリクエストされたサーバントを指すポインタを返す必要があります。ほとんどの場合、アプリケーションは、サーバントの新しいインスタンスを作成するC++の「new」文を使用することで、この処理を行います。「サーバントを破棄」するフェーズは、TPフレームワークが、実際に削除するサーバントへのリファレンスを削除する、ということです。
アプリケーションでは、サーバントを作成および削除する現在のこの動作が、将来のバージョンの製品で変更される可能性があることを考慮しておく必要があります。アプリケーションは現在の動作に依存しない必要があり、サーバントを再利用するサーバント・コードを記述する必要があります。具体的には、サーバント・コードは、サーバントがC++のnew文によって新規に作成されない場合にも動作する必要があります。TPフレームワークでは、非アクティブ化されたサーバントを削除しないで、後で再度アクティブ化できます。つまり、サーバントは、コンストラクタでサーバントが作成されたときではなく、サーバントのactivate_objectメソッドでコールバックされたときに自身を初期化する必要があるということです。
特殊なケース
アプリケーションで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サーバー・アプリケーションの作成』を参照してください。
オブジェクトの状態の保存と復元
CORBAオブジェクトがアクティブ化されている間、オブジェクトの状態はサーバント内に格納されます。TP::create_active_object_referenceを使用するアプリケーションとは異なり、状態は、オブジェクトが最初に呼び出されたとき、つまりオブジェクト参照の作成後にCORBAオブジェクトに対してメソッドが最初に呼び出されたときと、オブジェクトが非アクティブ化されて以降の呼出しで初期化する必要があります。CORBAオブジェクトが非アクティブ化されている間、オブジェクトの状態をサーバントがアクティブ化されていたプロセスの外部に保存する必要があります。オブジェクトの状態は、共有メモリー、ファイル、データベースなどに保存できます。CORBAオブジェクトを非アクティブ化する前に、オブジェクトの状態を保存して、オブジェクトがアクティブ化されたときに状態を復元する必要があります。
プログラマは、オブジェクトの状態の構成要素と、オブジェクトを非アクティブ化する前に何を保存し、オブジェクトをアクティブ化した後に何を復元するかを決定する必要があります。
CORBAオブジェクトのコンストラクタおよびデストラクタの使い方に関する注意
CORBAオブジェクトの状態をサーバント・クラスのコンストラクタまたはデストラクタで初期化、保存、または復元しないでください。これは、TPフレームワークが、サーバントのインスタンスを非アクティブ化するときに削除しないで、再利用する可能性があるためです。サーバントのインスタンスの作成および削除のタイミングについては、一切保証されません。
トランザクション
以降のセクションでは、トランザクション・ポリシーとトランザクションの使い方について説明します。
トランザクション・ポリシー
CORBAオブジェクトがグローバル・トランザクションに参加できるかどうかは、コンパイル時に実装に割り当てられたトランザクション・ポリシーによって制御されます。次のポリシーを割り当てることができます。
注意:
実装はトランザクションに関与しません。このインタフェース用に作成されるオブジェクトは、トランザクションに関与できません。このポリシーを設定した実装がトランザクションに関与した場合、例外(INVALID_TRANSACTION)が生成されます。インタフェースのUBBCONFIGファイルで指定したAUTOTRANポリシーは無視されます。
実装はトランザクションに関与しません。このポリシーでは、この実装からトランザクション内のリクエストを送信できます。インタフェースのUBBCONFIGファイルで指定したAUTOTRANポリシーは無視されます。
optional (これはデフォルトのtransaction_policyです。)
実装はトランザクションに関与できます。リクエストがトランザクションに関与する場合、オブジェクトはトランザクションに関与できます。トランザクションに関与するオブジェクトを含むサーバーは、XA準拠のリソース・マネージャに関連付けられているグループ内で構成する必要があります。AUTOTRANパラメータがインタフェースのUBBCONFIGファイルで指定されている場合、AUTOTRANは有効になります。
実装はトランザクションです。オブジェクトは、常に、トランザクションに関与する必要があります。リクエストがトランザクションの外部で行われた場合は、メソッドが呼び出される前に、トランザクションが自動的に開始されます。トランザクションは、メソッドが終了するときにコミットされます。(この動作は、オプションのトランザクション・ポリシーを持つオブジェクトに対してAUTOTRANを指定した場合と同じですが、この動作を実現するために管理構成が必要ないことと、管理構成でオーバーライドできないことが異なります。)トランザクション・オブジェクトを含むサーバーは、XA準拠のリソース・マネージャに関連付けられているグループ内に構成する必要があります。
注意:
optionalポリシーは、管理構成によって影響を受ける唯一のトランザクション・ポリシーです。システム管理者がUBBCONFIGファイルまたは管理ツールを使用して、AUTOTRAN属性をインタフェースに対して設定すると、既にトランザクションに関与している場合を除いて、オブジェクトの呼出し時にトランザクションが自動的に開始されます。つまり、alwaysポリシーを指定した場合と同じ動作になります。
トランザクションの初期化
トランザクションの初期化には、次の2つの方法があります。
CosTransactions::Current::begin()操作を使用した、アプリケーション・コードによる方法。この処理は、クライアントでもサーバーでも行うことができます。この操作の説明については、『CORBAトランザクションの使用』を参照してください。
トランザクション・ポリシーがalwaysに設定されています
トランザクション・ポリシーがoptionalに設定され、かつインタフェースに対してAUTOTRANが設定されています
詳細は、『CORBAトランザクションの使用』を参照してください。
トランザクションの終了
一般に、トランザクションの結果を処理することは、開始プロセスの責任です。したがって、次のことが言えます。
Oracle Tuxedoシステムによって、以下の動作が強制的に実行されます。
CORBAオブジェクトのメソッドが呼び出されたときにアクティブなトランザクションがなく、そのメソッドがトランザクションを開始した場合、トランザクションは、メソッド呼出しが復帰したとき、コミット、ロールバック、または一時停止される必要があります。これらのアクションが実行されない場合、トランザクションはTPフレームワークによってロールバックされ、CORBA::OBJ_ADAPTER例外がクライアント・アプリケーションに対して生成されます。この例外はトランザクションがサーバー・アプリケーションで初期化されたために発生します。したがって、クライアント・アプリケーションでは、TRANSACTION_ROLLEDBACKのようなトランザクション・エラーを予想していません。
トランザクションの一時停止と再開
CORBAオブジェクトは、メソッド呼出し内のトランザクションの一時停止および再開に関する規則に厳密に従う必要があります。次に、これらの規則と規則に違反した場合のエラー状態について説明します。
CORBAオブジェクト・メソッドが実行を開始すると、トランザクションに関する状態は次の3つのいずれかになります。
正当なサーバー・アプリケーションの動作: メソッドの実行中にトランザクションを一時停止および再開します。
不当なサーバー・アプリケーションの動作: 一時停止されたトランザクションに関与したメソッドから復帰します。つまり、一時停止された場合、再開しないままメソッドから復帰します。
エラー処理: 不当な動作が発生した場合、TPフレームワークによってCORBA::TRANSACTION_ROLLEDBACK例外がクライアント・アプリケーションに対して生成され、トランザクションはOracle Tuxedoシステムによってロールバックされます。
システムがトランザクションを開始して、AUTOTRANまたはalwaysトランザクション・ポリシーの動作を実行した。
注意:
操作呼出しを受信したときにトランザクションを自動的に開始する場合、各CORBAインタフェースに対して、AUTOTRANYesに設定します。AUTOTRANYesに設定しても、インタフェースがすでにトランザクション・モードにある場合は無効です。AUTOTRANの詳細は、『CORBAトランザクションの使用』を参照してください。
正当なサーバーの動作: メソッドの実行中にトランザクションを一時停止および再開します。
注意:
不当なサーバーの動作: 一時停止状態のトランザクションに関与したメソッドから復帰します(つまり、一時停止が呼び出された場合、再開を呼び出さずにメソッドから復帰します)。
エラー処理: 不当な動作が発生した場合、TPフレームワークによってCORBA::OBJ_ADAPTER例外がクライアントに対して生成され、トランザクションはロールバックされます。CORBA::OBJ_ADAPTER例外は、クライアント・アプリケーションがトランザクションを初期化していないために発生します。したがって、クライアント・アプリケーションでは、トランザクション・エラーが発生することを予想していません。
不当なサーバーの動作: トランザクションを開始して、トランザクションがアクティブな状態でメソッドから復帰します。
エラー処理: 不当な動作が発生した場合、TPフレームワークによってCORBA::OBJ_ADAPTER例外がクライアント・アプリケーションに対して生成され、トランザクションはOracle Tuxedoシステムによってロールバックされます。CORBA::OBJ_ADAPTER例外は、クライアント・アプリケーションがトランザクションを初期化していないために発生します。したがって、クライアント・アプリケーションでは、トランザクション・エラーが発生することを予想していません。
トランザクションに関する制約
Oracle Tuxedo CORBAトランザクションには、以下の制約が適用されます。
アプリケーションは、Server::initialize()でトランザクションを開始した場合、メソッドから復帰する前にトランザクションをコミットまたはロールバックする必要があります。アプリケーションがトランザクションを開始していない場合、TPフレームワークはサーバーを停止します。この理由は、Server::initializeメソッドの終了後に制御をアプリケーションに戻す予測可能な方法がないからです。
CORBAオブジェクトがトランザクションに関与しており、transactionアクティブ化ポリシーが設定されている場合、かつメソッドに渡された理由コードがDR_TRANS_COMMITTINGまたはDR_TRANS_ABORTEDの場合、Tobj_ServantBase::deactivate_objectメソッドからはどのCORBAオブジェクトに対しても呼出しは行われません。こうした呼出しに対しては、CORBA::BAD_INV_ORDER例外が生成されます。
SQLとグローバル・トランザクション
SQLおよびグローバル・トランザクションを使用する場合には、次のガイドラインに従ってください。
注意:
SQL COMMITおよびROLLBACK文を使用して、Current.begin()を明示的に使用して開始されたグローバル・トランザクションやシステムによって暗黙的に開始されたグローバル・トランザクションを終了することはできません。各データベース製品でグローバル・トランザクションを使用する場合のその他の制約については、データベース・ベンダーのマニュアルで確認してください。
トランザクションの結果に関する判断
CORBAオブジェクトは、トランザクション処理の2つの段階で、トランザクションの結果に関与することができます。
Current.rollback_onlyメソッドを使用すると、現在のトランザクションをロールバックすることが唯一の結果になることが保証されます。Current.rollback_only()は、どのCORBAオブジェクト・メソッドからも呼び出せます。
トランザクション・バウンドのアクティブ化ポリシーが設定されたCORBAオブジェクトでは、トランザクションの処理終了後にトランザクションをコミットするかロールバックするかを判断できます。これらのオブジェクトには、それらのdeactivate_objectメソッドがTPフレームワークによって呼び出されるとき、2フェーズ・コミット・アルゴリズムの開始前に、トランザクションの処理が終了したことが通知されます。
ただしこの動作は、processまたはmethodアクティブ化ポリシーが設定されたオブジェクトには適用されません。CORBAオブジェクトがトランザクションをロールバックする場合、CORBAオブジェクトはCurrent::rollback_onlyを呼び出します。トランザクションをコミットすることを支持する場合、その呼出しを行いません。ただし、コミットすることを支持してもトランザクションが実際にコミットされるとは限りません。その後、ほかのオブジェクトがトランザクションをロールバックすることを支持する可能性があるからです。
注意:
SQLカーソルのユーザーは、methodまたはprocessアクティブ化ポリシーを持つオブジェクトを使用する場合には注意する必要があります。プロセスは、クライアントが開始したトランザクション内にSQLカーソルをオープンします。通常のSQLデータベース製品では、クライアントがトランザクションをコミットすると、そのトランザクション内でオープンされたすべてのカーソルが自動的にクローズされますが、オブジェクトはそのカーソルがクローズされたことを示す通知を受け取りません。
トランザクションのタイムアウト
トランザクションのタイムアウトが発生すると、トランザクションをロールバックすることが唯一の結果になるようにトランザクションにマークされ、CORBA::TRANSACTION_ROLLEDBACK標準例外がクライアントに返されます。新しいリクエストを送信しようとすると、トランザクションが中断されるまで、必ずCORBA::TRANSACTION_ROLLEDBACK例外となって失敗します。
IIOPクライアント・フェイルオーバー
サーバー・インスタンスでいつ障害が発生したかについて、その障害の発生時点で行われていた処理との関連で判断することは必ずしも可能ではありません。たとえば、サーバー・インスタンスがクライアント・リクエストを処理した後、レスポンスを返す前に障害が発生した場合、リクエストが処理されたかどうかを判別することはできません。通常、レスポンスがない場合、ユーザーはリクエストを再試行します。
Oracle Tuxedo CORBAには、可用性の拡張を目的として、IIOPクライアント・フェイルオーバーのサポートが追加されました。IIOPクライアント・フェイルオーバーは、CORBAリモート・クライアントが自動的に代替ISLに接続し、障害時にリクエストを再試行するための透過的なメカニズムを提供します。
IIOPクライアント・フェイルオーバーでは、インタフェース実装をべき等としてマークします。べき等元実装は、悪影響なしで反復できる実装です。たとえば、SET BALANCEです。
再試行ポリシーを設定する
インタフェース実装をべき等としてマークするには、実装構成ファイル(ICF)でretry_policyオプションを使用して再試行ポリシーを設定する必要があります。ICFの詳細は、「実装構成ファイル(ICF)」という項を参照してください。
retry_policyオプションには2種類の設定があります。
never: デフォルト設定です。インタフェース実装がべき等元ではなく、リクエストは自動的には再試行されません。
always: インタフェース実装がべき等で、障害発生時には常にリクエストが再試行されます。
MIBのサポート
再試行ポリシーは、MIB(5) T_IFQUEUEおよびT_INTERFACEクラスに追加されたTA_RTPOLICY属性でチェックすることもできます。TA_RTPOLICY属性の値は、neverまたはalwaysです。
IIOPクライアント・フェイルオーバーを開始する
IIOPクライアント・フェイルオーバー・サポートを開始するには、UBBCONFIGファイルの*SERVERSセクションの-C warn|noneオプションを使用して、ISLサーバーを指定する必要があります
このオプションを使用すると、クライアントorbからISLへの非公式な直接接続が許可されます。-C warn|noneオプションを使用して指定されていないISLサーバーは、候補IIOPのゲートウェイ・プールには配置されません。その結果、クライアントはこれらのISLサーバーにはフェイルオーバーしません。
リスト3-1に示す次のUBBCONFIGファイルの例では、1行目と2行目に指定されたISLサーバーでクライアント・フェイルオーバーがサポートされます。3行目のISLサーバーでは、クライアント・フェイルオーバーはサポートされません。
リスト3-1 IIOPクライアント・フェイルオーバーを指定するUBBCONFIGファイルのエントリ例
*SERVERS
ISL SRVGRP=SYS_GRP1 SRVID=10 CLOPT="-A -- -C warn -n //myhost1:2468"
ISL SRVGRP=SYS_GRP2 SRVID=20 CLOPT="-A -- -C none -n //myhost2:2469"
ISL SRVGRP=SYS_GRP3 SRVID=30 CLOPT="-A -- -n //myhost3:2470"
 
IIOPクライアント・フェイルオーバーの制限事項
IIOPクライアント・フェイルオーバーは、以下の場合にはサポートされません。
Tuxedoシステムが提供するオブジェクト・フェイルオーバーの場合
アプリケーションが提供するオブジェクト・フェイルオーバーのみサポートされます。
関連項目
WebLogic CORBAでのクラスタリングとロード・バランシングのサポート
Tuxedo CORBA C++クライアントでは、WebLogicクラスタ・サーバーへのフェイルオーバーとロード・バランシングがサポートされています。詳細は、WebLogicドキュメントのクラスタのフェイルオーバーとレプリケーションに関する項およびクラスタのロード・バランシングに関する項を参照してください。
パラレル・オブジェクト
リリース8.0のOracle Tuxedo CORBAには、パフォーマンスの拡張を目的としてパラレル・オブジェクトのサポートが追加されています。パラレル・オブジェクト機能を使用すると、特定アプリケーションのすべてのビジネス・オブジェクトをステートレス・オブジェクトとして指定できます。これにより、1つのドメイン内の1つのサーバーでしか実行できないステートフル・ビジネス・オブジェクトとは異なり、ステートレス・ビジネス・オブジェクトは1つのドメイン内のすべてのサーバーで実行できます。パラレル・オブジェクトの利点は、次のとおりです。
パラレル・オブジェクトの詳細は、『CORBAアプリケーションのスケーリング、配布およびチューニング』を参照してください。
パラレル・オブジェクトを実装するために、同時実行性ポリシー・オプションがICFファイルに追加されています。特定のアプリケーションに対してパラレル・オブジェクトを選択するには、同時実行性ポリシー・オプションをユーザー制御に設定します。ユーザー制御の同時実行性を選択すると、ビジネス・オブジェクトはアクティブ・オブジェクト・マップ(AOM)に登録されないため、ステートレスとなり、同時に複数のサーバー上でアクティブ化できます。このため、このようなオブジェクトはパラレル・オブジェクトと呼ばれます。
ユーザー制御の同時実行性を選択した場合、サーバントの実装は以下のいずれかの記述に該当しなければなりません。
リリース8.0のOracle Tuxedoソフトウェアでは、実装構成ファイル(ICF)が変更されてユーザー制御の同時実行性をサポートするようになりました。リスト3-2では、このサポートのための変更箇所が太字で強調されています。ICFの構文の詳細は、「ICFの構文」を参照してください。
リスト3-2 ICFの構文
[#pragma activation_policy method|transaction|process]
[#pragma transaction_policy never|ignore|optional|always]
[#pragma concurrency_policy user_controlled|system_controlled]
[Module module-name {]
implementation [implementation-name]
{
implements (module-name::interface-name);
[activation_policy (method|transaction|process);]
[transaction_policy (never|ignore|optional|always);]
[concurrency_policy (user_controlled|system_controlled);]
};
[};]
 
ユーザー制御の同時実行性は、ファクトリ・ベース・ルーティング、すべてのアクティブ化ポリシー、およびすべてのトランザクション・ポリシーで使用できます。これらの機能との対話は次のとおりです。
オブジェクトの作成時にユーザーがファクトリ・ベース・ルーティングを指定すると、オブジェクトはそのグループ内のサーバーにルーティングされます。オブジェクト・キーにはファクトリ・ベース・ルーティングで選択されたグループが含まれていますが、クライアント・ルーティング・コードでは、インタフェースにユーザー制御の同時実行性が設定されていることを認識し、必要なグループを指定します。これは、Oracle Tuxedoの通常のルーティングを使用して行われます。
TPフレームワークでは、ユーザー制御の同時実行性を設定されたアクティブ化されたオブジェクトは、システム制御の同時実行性を設定されたオブジェクトと同じように扱われます。TPフレームワークでは、オブジェクトに関する情報はローカルのAOMに格納され、必要に応じてactivate_objectおよびdeactivate_objectメソッドが呼び出されます。ただし、オブジェクトはAOM内にエントリを持たないので、TPフレームワークはAOMのルーチンを呼び出しません。たとえば、アクティブ化されたオブジェクトはAOMハンドルを持たないので、停止時にAOMからエントリを削除する呼出しは行われません。
TPフレームワークでは、ユーザー制御の同時実行性を設定されたアクティブ化されたオブジェクトは、システム制御の同時実行性を設定されたオブジェクトと同じように扱われます。TPフレームワークがトランザクションのイベントに対してコールバックされると、トランザクションに関与するユーザー制御のオブジェクトに関する情報がAOMに格納されます。ステートフル・オブジェクトと比べてパラレル・オブジェクトをトランザクションで使用する場合の主な違いは、AOMがGTRID情報を格納するために使用されず、AOMのルーチンがトランザクション情報を更新または取得するために呼び出されないことです。
注意:
ユーザー制御の同時実行性について、1つ制約があります。TP::create_active_object_referenceは、ユーザー制御の同時実行性が設定されたインタフェースを渡されると、TobjS::IllegalOperation例外をスローします。AOMはユーザー制御の同時実行性が設定されている場合に使用されないので、TPフレームワークにはアクティブ化されたオブジェクトをこのサーバーに接続する方法がありません。
TPフレームワークAPI
この項では、TPフレームワークAPIについて説明します。このAPIの使用方法は、『CORBAサーバー・アプリケーションの作成』でも説明しています。
TPフレームワークは、次のコンポーネントから構成されます。
Server C++クラス。アプリケーション固有のサーバー初期化および終了ロジック用の仮想メソッドを持っています
ServerBase C++クラス。マルチスレッド・サーバー・アプリケーション用の仮想メソッドを持っています。
Tobj_ServantBase C++クラス。オブジェクトの状態管理用の仮想メソッドを持っています
TP C++クラス。次の処理を実行するためのメソッドを用意しています。
ユーザー・ログ(ULOG)ファイルへのメッセージの記録
TPフレームワークの可視部分は、2種類の操作で構成されています。
ユーザーが記述し、TPフレームワークで呼び出すコールバック・メソッド。Tobj_ServantBaseおよびServerクラスのメソッドも含まれます。これらの操作は、TPフレームワークのコードでのみ呼び出すためのものです。アプリケーション・コードでは、これらのクラスのメソッドを呼び出してはなりません。呼び出した場合、予期できない結果となる可能性があります。
Serverインタフェース
Serverインタフェースには、アプリケーション固有のサーバー初期化および終了ロジックに使用可能なコールバック・メソッドが用意されています。このインタフェースには、オブジェクトをアクティブ化するためにサーバントが必要な場合に、サーバントを作成するためのコールバック・メソッドも用意されています。
Serverインタフェースには次の特徴があります。
ServerクラスはC++ネイティブ・クラスです。
Server.hファイルには、Serverクラスの宣言および定義が格納されています。
Serverインタフェースのメソッドの詳細は、「ServerBaseインタフェース」を参照してください。
C++宣言
C++マッピングについては、「ServerBaseインタフェース」を参照してください。
ServerBaseインタフェース
serverBaseインタフェースを使用すると、マルチスレッド機能の利点を最大限に活用できます。ServerBaseクラスを継承する独自のServerクラスを作成することもできます。このクラスでは以下のものが提供されます。
ServerBaseクラスでは、以前のリリースのServerクラスに含まれていた操作を使用できます。Serverクラスは、ServerBaseクラスを継承します。
これらのオペレーションは、シングル・スレッド・アプリケーションでもマルチスレッド・アプリケーションでも使用できます。
これらのメソッドは、マルチスレッド・サーバー・アプリケーションでのみ使用できます。
ServerBase:: thread_initialize()
ServerBase::thread_release()
注意:
C++宣言(Server.h内)
C++のマッピングは次のとおりです。
class OBBEXPDLLUSER ServerBase {
public:
virtual CORBA::Boolean
initialize(int argc, char** argv) = 0;
virtual void
release() = 0;
virtual Tobj_Servant
create_servant(const char* interfaceName) = 0;
// Default Implementations Supplied
virtual Tobj_Servant
create_servant_with_id(const char* interfaceName,
const char* stroid);
virtual CORBA::Boolean
thread_initialize(int argc, char** argv);
virtual void
thread_release();
};
class Server : public ServerBase {
public:
CORBA::Boolean initialize(int argc, char** argv);
void release();
Tobj_Servant create_servant(const char* interfaceName);
};
Server::create_servant()
概要
サーバントを作成してC++オブジェクトをインスタンス化します。
C++バインディング
class Server {
public:
Tobj_Servant create_servant(const char* interfaceName);
};
引数
interfaceName
オブジェクトの完全修飾インタフェース名を含む文字列を指定します。この名前は、TP::create_object_reference()を使用してオブジェクト参照を作成した場合に指定したインタフェース名、またはTP::create_active_object_reference()の呼出しで使用したオブジェクト参照のインタフェース名と同じになります。この名前を使用して、作成する必要があるサーバントを決定できます。
例外
Server::create_servant()で例外がスローされた場合は、TPフレームワークがその例外を捕捉します。アクティブ化は失敗します。クライアントに対してCORBA::OBJECT_NOT_EXIST()例外が生成されます。また、エラー・メッセージが次のように例外型ごとにユーザー・ログ(ULOG)ファイルに書き込まれます。
TobjS::CreateServantFailed
"TPFW_CAT:23: ERROR: Activating object - application raised TobjS::CreateServantFailed. Reason = reason. Interface = interfaceName, OID = oid"
reasonはユーザー指定の理由を示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
TobjS::OutOfMemory
"TPFW_CAT:22: ERROR: Activating object - application raised TobjS::OutOfMemory. Reason = reason. Interface = interfaceName, OID = oid"
reasonはユーザー指定の理由を示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
CORBA::Exception
"TPFW_CAT:28: ERROR: Activating object - CORBA Exception not handled by application. Exception ID = exceptionID. Interface = interfaceName, OID = oid"
exceptionIDは例外のインタフェースIDを示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
その他の例外
"TPFW_CAT:29: ERROR: Activating object - Unknown Exception not handled by application. Exception ID = exceptionID. Interface = interfaceName, OID = oid"
exceptionIDは例外のインタフェースIDを示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
説明
create_servantメソッドは、リクエストがサーバーに到着し、そのリクエストを満たすために使用できるサーバントがない場合に、TPフレームワークによって呼び出されます。TPフレームワークは、作成するサーバントのインタフェース名を指定してcreate_servant メソッドを呼び出します。サーバー・アプリケーションでは、適切なC++オブジェクトをインスタンス化して、そのオブジェクトを指すポインタを返します。通常、このメソッドは、インタフェース名のswitch文を格納しており、インタフェース名に従って新しいオブジェクトを作成します。
注意:
戻り値
Tobj_Servant
指定されたインタフェースに対して新しく作成されたサーバント(インスタンス)に対するポインタ。認識できないインタフェースを指定してcreate_servant()を呼び出した場合、またはなんらかの理由でサーバントを作成できなかった場合は、NULL値が返されます。
create_servantメソッドがNULLポインタを返した場合、アクティブ化は失敗します。CORBA::OBJECT_NOT_EXIST()例外がクライアントに返されます。また、次のメッセージがユーザー・ログ(ULOG)に書き込まれます。
 
"TPFW_CAT:23: ERROR: Activating object - application raised TobjS::CreateServantFailed. Reason = Application's Server::create_servant returned NULL. Interface = interfaceName, OID = oid"
 
ここで、interfaceNameは呼び出したインタフェースのインタフェースID、oidは対応するオブジェクトIDです。
注意:
このリリースでは、ObjectIdの長さに関する制約がなくなりました。
ServerBase::create_servant_with_id()
概要
ターゲット・オブジェクト用のサーバントを作成します。このメソッドは、シングル・スレッドおよびマルチスレッド・サーバー・アプリケーションの開発をサポートします。
C++バインディング
Tobj_Servant create_servant_with_id (const char* interfaceName,
const char* stroid);
引数
interfaceName
オブジェクトの完全修飾インタフェース名を含む文字列を指定します。このインタフェース名は、オブジェクト参照を作成したときに指定した名前と同じである必要があります。
stroid
オブジェクトIDを文字列形式で指定します。オブジェクトIDは、処理対象のリクエストに関連付けられるオブジェクトを一意に識別します。このオブジェクトIDは、オブジェクト参照を作成したときに指定したIDと同じにする必要があります。
説明
TPフレームワークは、リクエストがサーバーに到着し、そのリクエストを満たすために使用できるサーバントがない場合にcreate_servant_with_idメソッドを呼び出します。TPフレームワークは、作成するサーバントのインタフェースとサーバントに関連付けられるオブジェクトのオブジェクトIDを渡します。サーバー・アプリケーションでは、適切なC++オブジェクトをインスタンス化して、そのオブジェクトを指すポインタを返します。通常、このメソッドは、インタフェース名のswitch文を格納しており、インタフェース名に従って新しいオブジェクトを作成します。オブジェクトIDを指定すると、サーバントの実装では、サーバント・インスタンスの作成時にターゲット・オブジェクトの情報を基に様々な決定を行えます。リエントラントのサポートは、サーバントの実装でターゲット・オブジェクトの情報を利用する方法の一例です。
ServerBaseクラスには、インタフェース名を渡す標準のcreate_servantメソッドを呼び出すcreate_servant_with_idのデフォルト実装が用意されています。このデフォルト実装では、ターゲット・オブジェクトIDパラメータは無視されます。
注意:
戻り値
Tobj_Servant
指定されたインタフェースに対して新しく作成されたサーバント(インスタンス)に対するポインタ。次のいずれかの条件が満たされる場合は、NULLを返します。
Tobj_Servant simple_per_request_server::create_servant_with_id(
const char* intf_repos_id, const char* stroid)
{
TP::userlog("create_servant_with_id called in thread %ld",
(unsigned long)SIMPTHR_GETCURRENTTHREADID);

//このオブジェクトIDに基づいて必要な初期化を
//実行する

return create_servant(intf_repos_id);
}
Server::initialize()
概要
アプリケーションが、データベースへのログイン、既知のオブジェクト・ファクトリの作成および登録、グローバル変数の初期化などのアプリケーション固有の初期化手続きを実行できるようにします。
C++バインディング
class Server {
public:
CORBA::Boolean initialize(int argc, char** argv);
};
引数
argcおよびargv引数がコマンド行から渡されます。argc引数には、サーバー名が格納されます。argv引数には、アプリケーション固有の最初のコマンド行オプションが格納されます(存在する場合)。
コマンド行オプションは、SERVERSセクションにあるサーバーのエントリのCLOPTパラメータを使用して、UBBCONFIGファイルで指定します。CLOPTパラメータには、システムで認識されるオプション、ダブル・ハイフン(--)、アプリケーション固有のオプションの順に指定します。argcの値は、アプリケーション固有のオプションの数よりも1大きい値です。詳細は、『ファイル形式、データ記述、MIBおよびシステム・プロセス・リファレンス』「ubbconfig(5)」を参照してください。
例外
Server::initialize()で例外が発生すると、TPフレームワークがその例外を捕捉します。TPフレームワークは、initialize()がFALSEを返した場合と同じように動作します。つまり、例外は失敗と見なされます。また、エラー・メッセージが次のように例外型ごとにユーザー・ログ(ULOG)ファイルに書き込まれます。
TobjS::InitializeFailed
"TPFW_CAT:1: ERROR: Exception in Server::initialize():IDL:beasys.com/TobjS/InitializeFailed:1.0. Reason = reason"
reasonは、アプリケーション・コードで指定される文字列です。例:
Throw TobjS::InitializeFailed(
"Couldn't register factory");
CORBA::Exception
"TPFW_CAT:1: ERROR: Exception in Server::initialize(): exception.Reason = unknown"
exceptionは、発生したCORBA例外のインタフェースIDです。
その他の例外
TPFW_CAT:1: ERROR: Exception in Server::initialize(): unknown exception. Reason = unknown"
説明
サーバー初期化の最後のステップとして呼び出されるinitializeコールバック・メソッドを使用すると、アプリケーションがアプリケーション固有の初期化を実行できます。
通常、サーバー・アプリケーションは、Server::initializeで次のタスクを実行します。
サーバー・アプリケーションに実装されたCORBAオブジェクト・ファクトリの参照を作成し、TP::register_factory()操作チェックを使用してFactoryFinderに登録します。
サーバー・アプリケーションでは、必要なXAリソース・マネージャを開く必要があります。このことは、次のいずれかのメソッドを呼び出すことによって実行します。
TP::open_xa_rm()
処理は静的関数で行い、オブジェクト参照を取得する必要がないため、これはサーバー・アプリケーションでは有用なテクニックです。
注意:
Tobj::TransactionCurrent::open_xa_rm()
TransactionCurrentオブジェクトへの参照は、Bootstrapオブジェクトから取得できます。Bootstrapオブジェクトへの参照を取得する方法の詳細は、「TP::bootstrap()」という項を参照してください。TransactionCurrentオブジェクトの詳細は、「CORBAブートストラップ処理のプログラミング・リファレンス」という項と『CORBAトランザクションの使用』を参照してください。
トランザクションは、Tobj::TransactionCurrent::open_xa_rm()またはTP::open_xa_rmメソッドの呼出し後のinitializeメソッドで開始できます。ただし、initialize()メソッドで開始したトランザクションは、initialize()が復帰する前に、サーバー・アプリケーションで終了する必要があります。制御が戻ったときにトランザクションがアクティブな場合、サーバー・アプリケーションが起動に失敗し、正常に終了します。これは、Server::initialize()が復帰した後にトランザクションをコミットするのかロールバックするのかを論理的に処理する方法がサーバー・アプリケーションにないからです。この状況はエラーとなります。
戻り値
BooleanのTRUEまたはFALSETRUEは成功を示します。FALSEは失敗を示します。initialize()でエラーが発生した場合、アプリケーション・コードはFALSEを返します。アプリケーション・コードでは、システム・コールのexit()を呼び出してはなりません。exit()を呼び出すと、TPフレームワークが起動時に割り当てられたリソースを解放できないので、予期できない結果が発生する可能性があります。
戻り値がFALSEの場合は、次のように処理されます。
Server::release()は呼び出されません。
initialize()メソッドで開始され、終了されていないトランザクションは、最終的にタイムアウトします。自動的にロールバックされるわけではありません。
ServerBase::thread_initialize()
概要
Oracle Tuxedoソフトウェアを使用して作成されたスレッドに対して、必要なアプリケーション固有の初期化を実行します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
C++バインディング
CORBA::Boolean thread_initialize(int argc, char** argv)
引数
argc
アプリケーションに指定する引数の数。最初に、このカウントはmain関数に渡されます
argv
アプリケーションに指定する引数。最初に、これらの引数はmain関数に渡されます。
説明
スレッド・プールを管理する場合、Oracle Tuxedoソフトウェアでは、オペレーティング・システムのスレッド・ライブラリ・サービスを使用してスレッドを作成および解放します。アプリケーションの要件によっては、リクエストを処理する前にこれらのスレッドを初期化する必要があります。
thread_initializeコールバック・メソッドは、スレッドが作成されるたびに、スレッドの初期化を目的として呼び出されます。ただし、Oracle Tuxedoソフトウェアでは、リクエストをディスパッチするために多数のシステム所有スレッドを管理しています。これらのスレッドも、スレッド・プールに追加されます。状況によっては、ユーザーが実装したサーバントのメソッドもこれらのシステム所有スレッドで実行されます。このため、Oracle Tuxedoソフトウェアではthread_initializeメソッドを呼び出して、システム所有のスレッドが初期化されます。
ServerBaseクラスには、初期化されたスレッドでXAリソース・マネージャを開くthread_initializeメソッドのデフォルト実装が用意されています。
戻り値
CORBA::Boolean
スレッドの初期化に成功した場合はTrueです。
CORBA::Boolean simple_per_request_server::thread_initialize(
int argc, char** argv)
{
TP::userlog("thread_initialize called in thread %ld",
(unsigned long)SIMPTHR_GETCURRENTTHREADID);
return CORBA_TRUE;
}
Server::release()
概要
アプリケーションが、データベースからのログオフ、既知のファクトリの登録の削除、リソースの割当て解除などのアプリケーション固有のクリーンアップを実行できるようにします。
C++バインディング
typedef Tobj_ServantBase* Tobj_Servant;
class Server {
public:
void release();
};
引数
なし。
例外
release()で例外が発生した場合は、TPフレームワークがその例外を捕捉します。各例外により、エラー・メッセージが次のようにユーザー・ログ(ULOG)ファイルに書き込まれます。
TobjS::ReleaseFailed
"TPFW_CAT:2: WARN: Exception in Server::release(): IDL:beasys.com/TobjS/ReleaseFailed:1.0. Reason = reason"
reasonは、アプリケーション・コードで指定される文字列です。例:
Throw TobjS::ReleaseFailed(
"Couldn't unregister factory");
CORBA::Exception
"TPFW_CAT:2: WARN: Exception in Server::release(): exception.Reason = unknown"
exceptionは、発生したCORBA例外のインタフェースIDです。
その他の例外
"TPFW_CAT:2: WARN: Exception in Server::release(): unknown exception. Reason = unknown"
いずれの場合でも、例外の発生に続いてサーバーが終了します。
説明
サーバー停止の最初のステップとして呼び出されるreleaseコールバック・メソッドを使用すると、アプリケーションがアプリケーション固有のクリーンアップを実行できます。ユーザーは、仮想関数の定義をオーバーライドする必要があります。
通常、このメソッドでは以下の処理が実行されます。
Server::initialize()でFactoryFinderに登録されたCORBAオブジェクト・ファクトリの登録の削除。
このメソッドは、通常は管理者またはオペレータからのtmshutdownコマンドに対して呼び出されます。
TPフレームワークには、Server::release()のデフォルト実装が用意されています。デフォルト実装は、サーバー用のXAリソース・マネージャを閉じます。この処理は、UBBCONFIGファイルでサーバーのグループに対してデフォルトとして構成されているCLOSEINFOを使用するtx_close()呼出しによって行われます。
アプリケーションでは、開かれているXAリソース・マネージャを閉じる必要があります。このことは、次のいずれかの呼出しを発行することによって実行します。
注意:
Tobj::TransactionCurrent::close_xa_rm()TransactionCurrentオブジェクトのリファレンスは、Bootstrapオブジェクトから取得できます。Bootstrapオブジェクトへの参照を取得する方法の詳細は、「TP::bootstrap()」という項を参照してください。TransactionCurrentオブジェクトの詳細は、「CORBAブートストラップ処理のプログラミング・リファレンス」『CORBAトランザクションの使用』を参照してください。
注意:
サーバーがtmshutdown(1)コマンドから停止リクエストを受信すると、他のリモート・オブジェクトからのリクエストを受信できなくなります。サーバーを停止する場合、順序を考慮しなければならないことがあります。たとえば、サーバー1のServer::release()メソッドからサーバー2にあるオブジェクトのメソッドにアクセスする必要がある場合、サーバー1を停止してから、サーバー2を停止しなければなりません。特に、TP::unregister_factory()メソッドは、別のサーバーにあるFactoryFinder Registrarオブジェクトにアクセスします。通常、TP::unregister_factory()メソッドはrelease()メソッドから呼び出されるので、FactoryFinderサーバーは、Server::release()メソッドでTP::unregister_factory()を呼び出すすべてのサーバーの後に停止する必要があります。
戻り値
なし。
ServerBase::thread_release()
概要
Oracle Tuxedoソフトウェアで作成されたスレッドが解放されたときに、アプリケーション固有のクリーンアップを実行します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
C++バインディング
void thread_release()
引数
なし。
説明
thread_releaseコールバック・メソッドは、スレッドが解放されるたびに呼び出されます。アプリケーション固有のリソース・クリーンアップを実行する場合は、thread_releaseを実装します。
ServerBaseクラスには、解放されたスレッドのXAリソース・マネージャを閉じるthread_releaseメソッドのデフォルト実装が用意されています。
戻り値
なし。
void simple_per_request_server::thread_release()
{
TP::userlog("thread_release called in thread %ld",
(unsigned long)SIMPTHR_GETCURRENTTHREADID);
}
Tobj_ServantBaseインタフェース
Tobj_ServantBaseインタフェースは、PortableServer::RefCountServantBaseクラスから継承され、CORBAオブジェクトがスレッド・セーフ方式でその状態の管理を支援できるようにする操作を定義します。IDLコンパイラによって生成されたすべての実装スケルトンは、Tobj_ServantBaseクラスを自動的に継承します。Tobj_ServantBaseクラスには、プログラマがオプションで実装できる2つの仮想メソッド(activate_object()およびdeactivate_object())が含まれます。
アクティブ化されていないCORBAオブジェクトに対するリクエストが受信されるたびに、オブジェクトがアクティブ化され、activate_object()メソッドがサーバントに対して呼び出されます。CORBAオブジェクトが非アクティブ化されると、deactivate_object()メソッドがサーバントに対して呼び出されます。非アクティブ化のタイミングは、実装のアクティブ化ポリシーによって決まります。deactivate_object()メソッドが呼び出されると、TPフレームワークは呼出しの理由を示す理由コードを渡します。
これらのメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
注意:
CORBAオブジェクトのアクティブ化と非アクティブ化に対して呼び出されることがTPフレームワークによって保証されるメソッドは、Tobj_ServantBase::activate_object()およびTobj_ServantBase::deactivate_object()のみです。サーバント・クラス・コンストラクタおよびデストラクタは、アクティブ化または非アクティブ化時に(C++のServer::create_servant呼出しを介して)呼び出される場合と呼び出されない場合があります。したがって、サーバー・アプリケーション・コードは、サーバント・クラスのコンストラクタまたはデストラクタでCORBAオブジェクトの状態処理を行ってはなりません。
注意:
プログラマが直接的にTobj_ServantBaseへのキャストや参照を使用する必要はありません。Tobj_ServantBaseメソッドはスケルトンに含まれているので、サーバントの実装にも含まれることになります。プログラマはactivate_objectおよびdeactivate_objectメソッドを定義できますが、これらのメソッドを直接呼び出してはなりません。TPフレームワークだけがこれらのメソッドを呼び出します。
C++宣言(Tobj_ServantBase.h内)
次に、Tobj_servantBaseインタフェースのC++マッピングを示します。
class Tobj_ServantBase : public PortableServer::RefCountServantBase {
public:
Tobj_ServantBase& operator=(const Tobj_ServantBase&);
Tobj_ServantBase() {}
Tobj_ServantBase(const Tobj_ServantBase& s) :
PortableServer::RefCountServantBase(s) {}
virtual void activate_object(const char *) {}
virtual void deactivate_object(const char*,
TobjS::DeactivateReasonValue) {}
virtual CORBA::Boolean _is_reentrant() { return CORBA_FALSE; }
};
typedef Tobj_ServantBase * Tobj_Servant;
Tobj_ServantBase::activate_object()
概要
オブジェクトIDをサーバントに関連付けます。このメソッドによって、アプリケーションでは、オブジェクトがアクティブ化されたときにオブジェクトの状態を復元できます。状態は、共有メモリー、通常のフラット・ファイルまたはデータベース・ファイルから復元できます。
C++バインディング
class Tobj_ServantBase : public PortableServer::ServantBase {
public:
virtual void activate_object(const char * stroid) {}
};
引数
stroid
オブジェクトIDを文字列形式で指定します。 オブジェクトIDは、クラスのこのインスタンスを一意に識別します。このオブジェクトIDは、TP::create_object_reference()を使用してオブジェクト参照を作成したときに指定したID、またはTP::create_active_object_reference()の呼出しで使用したオブジェクト参照のIDと同じになります。
注意:
説明
オブジェクトのアクティブ化は、クライアントがアクティブ化されていないCORBAオブジェクトのメソッドを呼び出すことで開始されます。これにより、ポータブル・オブジェクト・アダプタ(POA)がサーバントをCORBAオブジェクトに割り当てます。activate_object()メソッドは、クライアントが呼び出したメソッドの前に呼び出されます。activate_object()から正常に制御が戻った場合、つまり例外が発生しなかった場合、リクエストされたメソッドがサーバントで実行されます。
プログラマは、activate_object()およびdeactivate_object()メソッドとクライアントが呼び出すメソッドを使用して、オブジェクトの状態を管理できます。これらのメソッドを使用してオブジェクトの状態を管理する方法は、アプリケーションのニーズによって異なります。これらのメソッドの使用方法は、「CORBAサーバー・アプリケーションの作成」を参照してください。
オブジェクトがグローバル・トランザクションに関与している場合、activate_object()はそのグローバル・トランザクションのスコープ内で実行されます。
オブジェクトのプログラマは、格納されているオブジェクトの状態が一貫性があるかどうかをチェックする必要があります。つまり、アプリケーション・コードでは、deactivate_object()がオブジェクトの状態を正しく保存したかどうかを示す永続性フラグを保存する必要があります。このフラグをactivate_object()でチェックします。
戻り値
なし。
例外
activate_object()の実行中にエラーが発生した場合、アプリケーション・コードでは、CORBA標準例外またはTobjS::ActivateObjectFailed例外を生成する必要があります。例外が発生すると、TPフレームワークは例外を捕捉して、以下のイベントが発生します。
activate_object()がクライアントの開始したトランザクション内で実行されている場合、トランザクションはロールバックされません
CORBA::OBJECT_NOT_EXIST例外がクライアントに返されます。
注意:
操作呼出しを受信したときにトランザクションを自動的に開始する場合、各CORBAインタフェースに対して、AUTOTRANYesに設定します。AUTOTRANYesに設定しても、インタフェースがすでにトランザクション・モードにある場合は無効です。AUTOTRANの詳細は、『CORBAトランザクションの使用』を参照してください。
TobjS::ActivateObjectFailed
"TPFW_CAT:24: ERROR: Activating object - application raised TobjS::ActivateObjectFailed. Reason = reason.インタフェース = interfaceName、OID = oid"
reasonはユーザー指定の理由を示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
TobjS::OutOfMemory
"TPFW_CAT:22: ERROR: Activating object - application raised TobjS::OutOfMemory. Reason = reason. Interface = interfaceName, OID = oid"
reasonはユーザー指定の理由を示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
CORBA::Exception
"TPFW_CAT:25: ERROR: Activating object - CORBA Exception not handled by application. Exception ID = exceptionID. Interface = interfaceName, OID = oid"
exceptionIDは例外のインタフェースIDを示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
その他の例外
"TPFW_CAT:26: ERROR: Activating object - Unknown Exception not handled by application. Exception ID = exceptionID. Interface = interfaceName, OID = oid"
exceptionIDは例外のインタフェースIDを示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
Tobj_ServantBase::_add_ref()
概要
サーバントへの参照を追加します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
注意:
Oracle Tuxedoリリース8.0以降で作成するアプリケーションでは、TP::application_responsibility()メソッドのかわりにこのメソッドを使用します。
C++バインディング
void _add_ref()
引数
なし。
説明
このメソッドは、サーバントへの参照が必要な場合に呼び出します。このメソッドを呼び出すと、サーバントの参照カウントが1つ増えます。
戻り値
なし。
myServant * servant = new intf_i();
if(servant != NULL)
servant->_add_ref();
Tobj_ServantBase::deactivate_object()
概要
オブジェクトIDとサーバントとの関連付けを削除します。このメソッドを使用すると、アプリケーションでは、オブジェクトが非アクティブ化される前にオブジェクトの状態のすべてまたは一部を保存できます。状態は、共有メモリー、通常のフラット・ファイル、またはデータベース・ファイルに保存できます。
C++バインディング
class Tobj_ServantBase : public PortableServer::ServantBase {
public:
virtual void deactivate_object(const char* stroid,
TobjS::DeactivateReasonValue reason) {}
};
引数
stroid
オブジェクトIDを文字列形式で指定します。 オブジェクトIDは、クラスのこのインスタンスを一意に識別します。
注意:
reason
このメソッドが呼び出される原因となったイベントを示します。reasonコードは次のいずれかになります。
DR_METHOD_END
メソッドの終了後にオブジェクトが非アクティブ化されることを示します。オブジェクトの非アクティブ化ポリシーが次の場合に使用されます。
- method
- transaction (アクティブなトランザクションがない場合のみ)
- process (TP::deactivateEnable()が呼び出された場合)
DR_SERVER_SHUTDOWN
サーバーが通常の方法で停止されるためにオブジェクトが非アクティブ化されることを示します。オブジェクトの非アクティブ化ポリシーが次の場合に使用されます。
- transaction (トランザクションがアクティブな場合のみ)
- process
サーバーを通常の方法で停止する場合、そのサーバーが関与しているすべてのトランザクションがロールバックの対象としてマークされることに注意してください。
DR_TRANS_ABORTED
reasonコードは、transactionアクティブ化ポリシーが設定されたオブジェクト専用です。これは、トランザクションがクライアントまたはシステムによって自動的に開始された場合に発生します。deactivate_object()メソッドがこの理由コードで呼び出された場合、トランザクションはロールバック対象としてマークされます。
 
DR_TRANS_COMMITTING
reasonコードは、transactionアクティブ化ポリシーが設定されたオブジェクト専用です。これは、トランザクションがクライアントまたはTPフレームワークによって開始された場合に発生します。これは、オブジェクトが呼び出されたトランザクションに対してCurrent.commit()操作が呼び出されたことを示します。deactivate_object()メソッドは、トランザクション・マネージャが2フェーズ・コミット・アルゴリズムを開始する直前、つまりprepareがリソース・マネージャに送信される前に呼び出されます。
CORBAオブジェクトでは、DR_TRANS_COMMITTING reasonコードでdeactivate_object()メソッドが呼び出されたときに、トランザクションの結果に関して判断できます。このメソッドは、Current.rollback_only()メソッドを呼び出すことで、トランザクションをロールバックさせることができます。そうでない場合は、2フェーズ・コミット・アルゴリズムが続行されます。トランザクションは、Current.rollback_only()がこのメソッドで呼び出されなかったという理由以外でもコミットされないことがあります。トランザクションに関与するその他のCORBAオブジェクトまたはリソース・マネージャも、トランザクションのロールバックを支持できます。
 
DR_EXPLICIT_DEACTIVATE
アプリケーションがこのオブジェクトに対してTP::deactivateEnable(-,-,-)を実行したためにオブジェクトが非アクティブ化されることを示します。これは、processアクティブ化ポリシーを設定されたオブジェクトに関してのみ発生します。
説明
オブジェクトの非アクティブ化は、CORBAオブジェクトの実装に設定されているアクティブ化ポリシーに従って、システムまたはアプリケーションによって開始されます。deactivate_object()メソッドは、CORBAオブジェクトが非アクティブ化される前に呼び出されます。これらのポリシーおよび使用方法の詳細は、「ICFの構文」という項を参照してください。
CORBAオブジェクトの実装のアクティブ化ポリシーがmethodの場合にクライアントによって呼び出されるメソッド、またはアクティブ化ポリシーがtransactionの場合にトランザクションの処理が終わったときに呼び出されるメソッドの実行後に、非アクティブ化が発生する場合もあります。また、アクティブ化ポリシーがtransactionまたはprocessの場合に、サーバーが停止されると発生します。
さらに、Oracle Tuxedoソフトウェアでは、TP::deactivateEnable()およびTP::deactivateEnable(-,-,-)メソッドを使用することにより、processまたはmethodのアクティブ化ポリシーを持つCORBAオブジェクトをユーザー制御で非アクティブ化できます。TP::deactivateEnableをオブジェクトのメソッド内で呼び出すと、メソッドの終了時にそのオブジェクトが非アクティブ化されます。transactionアクティブ化ポリシーが設定されたオブジェクトでTP::deactivateEnableを呼び出すと、例外(TobjS::IllegalOperation)が発生し、TPフレームワークは何の処理も行いません。processアクティブ化ポリシーが設定されたオブジェクトに対してTP::deactivateEnable(-,-,-)を呼び出すと、そのオブジェクトは非アクティブ化されます。詳細は、「TP::deactivateEnable()」という項を参照してください。
注意:
deactivate_objectメソッドは、サーバーの停止時に、アクティブ・オブジェクト・マップに残っている各オブジェクト - TPフレームワークによって暗黙的に登録される場合(オン・デマンド・アクティブ化テクニックTP::create_servantとサーバントのactivate_objectメソッド)と、ユーザーによりTP::create_active_object_referenceで明示的に登録される場合があります - に対して呼び出されます。
プログラマは、activate_object()およびdeactivate_object()メソッドとクライアントが明示的に呼び出すメソッドを使用して、オブジェクトの状態を管理できます。これらのメソッドを使用してオブジェクトの状態を管理する方法は、アプリケーションのニーズによって異なります。これらのメソッドの使用方法は、「CORBAサーバー・アプリケーションの作成」を参照してください。
transactionアクティブ化ポリシーが設定されたCORBAオブジェクトでは、DR_TRANS_COMMITTING理由コードでdeactivate_object()メソッドが呼び出されたときに、トランザクションの結果に関して判断できます。このメソッドは、Current.rollback_only()メソッドを呼び出すことで、トランザクションをロールバックさせることができます。そうでない場合は、2フェーズ・コミット・アルゴリズムが続行されます。トランザクションは、Current.rollback_only()がこのメソッドで呼び出されなかったという理由以外でもコミットされないことがあります。トランザクションに関与するその他のCORBAオブジェクトまたはリソース・マネージャも、トランザクションのロールバックを支持できます。
制約
このメソッドが呼び出されたときにオブジェクトがトランザクションに関与している場合、オブジェクトが呼び出された理由に基づいて、実行可能な処理が制約されます。オブジェクトがトランザクションに関与していた場合、アクティブ化ポリシーがtransactionで、呼出しのreasonコードは次のいずれかです。
DR_TRANS_ABORTED
このメソッドでは、CORBAオブジェクトを呼び出せません。tpcall()は許可されません。トランザクションを一時停止したり開始したりすることはできません。
DR_TRANS_COMMITTING
このメソッドでは、CORBAオブジェクトを呼び出せません。tpcall()は許可されません。トランザクションを一時停止したり開始したりすることはできません。
こうした制約がある理由は、トランザクション・バウンドのアクティブ化ポリシーを設定されたオブジェクトの非アクティブ化が、トランザクションのトランザクション・マネージャから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フレームワークは例外を捕捉して、次のイベントが発生します。
クライアントには、deactivate_object()で発生した例外は通知されません。
TobjS::DeactivateObjectFailed
"TPFW_CAT:27: ERROR: De-activating object - application raised TobjS::DeactivateObjectFailed. Reason = reason.インタフェース = interfaceName、OID = oid"
reasonはユーザー指定の理由を示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
CORBA::Exception
"TPFW_CAT:28: ERROR: De-activating object - CORBA Exception not handled by application. Exception ID = exceptionID.インタフェース = interfaceName、OID = oid"
exceptionIDは例外のインタフェースIDを示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
その他の例外
"TPFW_CAT:29: ERROR: De-activating object - Unknown Exception not handled by application. Exception ID = exceptionID.インタフェース = interfaceName、OID = oid"
exceptionIDは例外のインタフェースIDを示し、interfaceNameoidはそれぞれ呼び出されたCORBAオブジェクトのインタフェースIDとオブジェクトIDを示します。
Tobj_ServantBase::_is_reentrant()
概要
オブジェクトが同時のリエントラント呼出しをサポートすることを示します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
C++バインディング
CORBA::Boolean _is_reentrant()
引数
なし。
説明
Oracle Tuxedoサーバー・インフラストラクチャでは、このメソッドを使用して、サーバント実装がリエントラント呼出しをサポートしているかどうかを判断します。リエントラントをサポートするには、複数のスレッドがオブジェクトと対話する場合に状態の整合性を保護するためのコードをサーバントに含める必要があります。
Tobj_ServantBaseクラスには、FALSEを返す_is_reentrantメソッドのデフォルト実装が用意されています。
戻り値
CORBA::Boolean
サーバントがリエントラントをサポートしている場合にTRUEを返します。
CORBA::Boolean Simple_i::_is_reentrant()
{ TP::userlog("_is_reentrant called in thread %ld",
(unsigned long)SIMPTHR_GETCURRENTTHREADID);
return CORBA_TRUE;
}
Tobj_ServantBase::_remove_ref()
概要
サーバントへの参照を解放します。このメソッドは、マルチスレッド・サーバー・アプリケーションの開発をサポートします。
注意:
Oracle Tuxedoリリース8.0以降で作成するアプリケーションでは、TP::application_responsibility()メソッドで使用していたC++のdelete文のかわりに、このメソッドを使用します。
C++バインディング
void _remove_ref()
パラメータ
なし。
説明
このメソッドは、サーバントへの参照が必要でなくなった場合に呼び出します。このメソッドを呼び出すと、サーバントの参照カウントが1つ減ります。_remove_ref()メソッドによって参照カウントがゼロになると、このメソッドは自身のthisポインタに対してC++のdelete文を呼び出し、サーバントを削除します。
戻り値
なし。
if(servant != NULL)
servant->_remove_ref();
TPインタフェース
TPインタフェースでは、アプリケーション・コードで呼び出せるサービス・メソッドのセットが提供されます。これは、アプリケーション・コードで安全に呼び出せるTPフレームワーク内の唯一のインタフェースです。その他のインタフェースは、システム・コードでのみ呼び出すことを目的としたコールバック・メソッドを持っています。
このインタフェースの目的は、ポータブル・オブジェクト・アダプタ(POA)、CORBAネーミング・サービスおよびOracle Tuxedoシステムで提供される、基礎となるAPIに対する呼出しのかわりに、アプリケーション・コードで呼出し可能な高レベルの呼出しを行うことができるようにすることです。これらの呼出しを使用することで、プログラマは、基礎となるAPIの複雑性を意識しないで、より簡単なAPIを学習できます。TPインタフェースでは、CORBA APIを拡張したOracle Tuxedoソフトウェアの次の2つの機能を暗黙的に使用します。
FactoryFinderオブジェクトの詳細は、「FactoryFinderインタフェース」という項を参照してください。ファクトリ・ベース・ルーティングの詳細は、Oracle Tuxedoアプリケーションの設定を参照してください。
使用上の注意
サーバー・アプリケーションの初期化時に、アプリケーションはアプリケーション・ファクトリ用のオブジェクト参照を作成します。作成後、ファクトリのオブジェクト参照をファクトリidフィールドと一緒に渡して、register_factory()メソッドを呼び出します。サーバーの解放(停止)時には、アプリケーションはunregister_factory()メソッドを使用して、ファクトリの登録を削除します。
TPクラスはC++ネイティブ・クラスです。
TP.hファイルには、TPクラスの宣言および定義が格納されています。
C++宣言(TP.h内)
C++のマッピングは次のとおりです。
class TP {
public:
static CORBA::Object_ptr create_object_reference(
const char* interfaceName,
const char* stroid,
CORBA::NVList_ptr criteria);
static CORBA::Object_ptr create_active_object_reference(
const char* interfaceName,
const char* stroid,
Tobj_Servant servant);
static CORBA::Object_ptr get_object_reference();
static void register_factory(
CORBA::Object_ptr factory_or,
const char* factory_id);
static void unregister_factory(
CORBA::Object_ptr factory_or,
const char* factory_id);
static void deactivateEnable()
static void deactivateEnable(
const char* interfaceName,
const char* stroid,
Tobj_Servant servant);
static CORBA::ORB_ptr orb();
static Tobj_Bootstrap* bootstrap();
static void open_xa_rm();
static void close_xa_rm();
static int userlog(char*, ... );
static char* get_object_id(CORBA::Object_ptr obj);
static void application_responsibility(
Tobj_Servant servant);
};
TP::application_responsibility()
概要
アプリケーションがサーバントの存続期間に責任を持つことをTPフレームワークに伝えます。
注意:
C++バインディング
static void application_responsibility(Tobj_Servant servant);
引数
servant
TPフレームワークにすでに認識されているサーバントに対するポインタ。
例外
TobjS::InvalidServant
指定されたサーバントがNULLであることを示します。
説明
このメソッドは、アプリケーションがサーバントの存続期間を制御することをTPフレームワークに通知します。このメソッドを呼び出すと、TPフレームワークがオブジェクトを非アクティブ化した後に、つまりサーバントのdeactivate_objectメソッドを呼び出した後に、オブジェクトに対して何の処理も行われません。
サーバントをアプリケーション側で処理する場合、その他のC++インスタンスと同じように、不要になった時点でサーバントを削除しなければなりません。
サーバントがTPフレームワークに認識されていない(アクティブ化されていない)場合、この呼出しは無効です。
戻り値
なし。
TP::bootstrap()
概要
Tobj::Tobj_Bootstrapオブジェクトに対するポインタを返します。Bootstrapオブジェクトは、FactoryFinderオブジェクト、インタフェース・リポジトリ、TransactionCurrentオブジェクト、およびSecurityCurrentオブジェクトへの初期リファレンスにアクセスする場合に使用します。
C++バインディング
static Tobj_Bootstrap* TP::bootstrap();
引数
なし。
戻り値
bootstrap()は、正常に終了すると、サーバー・アプリケーションの開始時にTPフレームワークで作成されたTobj::Tobj_Bootstrapオブジェクトに対するポインタを返します。
例外
なし。
説明
TPフレームワークでは、初期化の一部としてTobj::Tobj_Bootstrapオブジェクトが作成されます。したがって、アプリケーション・コードで他のTobj::Tobj_Bootstrapオブジェクトをサーバー内に作成する必要はありません。
注意:
Tobj::Tobj_Bootstrapオブジェクトの所有権はTPフレームワークにあるため、サーバー・アプリケーション・コードでBootstrapオブジェクトを破棄しないようにしてください。
注意:
CORBA INSブートストラップ処理メカニズムを使用し、セキュリティ用のSecurityCurrentまたはトランザクション用のTransactionCurrentを使用しない場合は、Bootstrapオブジェクトを使用する必要はありません。
TP::close_xa_rm()
概要
呼出しプロセスのリンク先のXAリソース・マネージャを閉じます。
C++バインディング
static void TP::close_xa_rm ();
引数
なし。
説明
close_xa_rm()メソッドは、呼出しプロセスのリンク先のXAリソース・マネージャを閉じます。XAリソース・マネージャは、OracleやInformixなどのデータベース・ベンダーから提供されます。
注意:
この呼出しの機能は、Tobj::TransactionCurrent::close_xa_rm()によっても提供されます。TransactionCurrentオブジェクトのオブジェクト参照を取得する必要がないので、サーバー・アプリケーションでリソース・マネージャを閉じる方法としては、TP::close_xa_rm() メソッドを使う方がはるかに便利です。TransactionCurrentオブジェクトのリファレンスは、Bootstrapオブジェクトから取得できます。Bootstrapオブジェクトへの参照を取得する方法の詳細は、「TP::bootstrap()」を参照してください。TransactionCurrentオブジェクトの詳細は、「CORBAブートストラップ処理のプログラミング・リファレンス」という項と『CORBAトランザクションの使用』を参照してください。
このメソッドは、グローバル・トランザクションに関与する各サーバーに対してServer::release()メソッドから1回呼び出す必要があります。これには、XAリソース・マネージャにリンクされているサーバーと、グローバル・トランザクションに関与し、XA準拠リソース・マネージャに実際にはリンクされていないサーバーが含まれます。
close_xa_rm()メソッドは、リソース・マネージャに固有のクローズ呼出しのかわりに呼び出します。リソース・マネージャの初期化セマンティクスはそれぞれ異なるので、特定のリソース・マネージャを閉じるための情報を、Oracle TuxedoシステムのUBBCONFIGファイルのGROUPSセクションにあるCLOSEINFOパラメータに指定します。
CLOSEINFO文字列の形式は、基礎となるリソース・マネージャを提供しているデータベース・ベンダーの要件によって異なります。CLOSEINFOパラメータの詳細は、Oracle Tuxedoアプリケーションの設定と、『ファイル形式、データ記述、MIBおよびシステム・プロセス・リファレンス』ubbconfig(5)のリファレンス・ページを参照してください。また、XAライブラリを使用するアプリケーションの開発およびインストール方法については、データベース・ベンダーのドキュメントを参照してください。
戻り値
なし。
例外
CORBA::BAD_INV_ORDER
アクティブなトランザクションがあります。トランザクションがアクティブになっている場合、リソース・マネージャを閉じることはできません。
Tobj::RMFailed
tx_close()呼出しによって、エラー戻りコードが返されました。
注意:
TPフレームワークによって返されるその他の例外とは異なり、Tobj::RMFailed例外は、TobjS_c.h (TobjS.idlから派生)ではなく、tobj_c.h (tobj.idlから派生)で定義されます。これは、ネイティブ・クライアントでもXAリソース・マネージャを開けるからです。したがって、返される例外は、ネイティブ・クライアント・コードおよびServer::release() (ネイティブ・クライアントと共有される代替メカニズムであるTransactionCurrent::close_xa_rmを使用している場合)で想定される例外と一致します。
TP::create_active_object_reference()
概要
オブジェクト参照を作成し、オブジェクトを事前にアクティブ化します。
C++バインディング
static CORBA::Object_ptr
create_active_object_reference(
const char* interfaceName,
const char* stroid,
Tobj_Servant servant);
引数
interfaceName
オブジェクトの完全修飾インタフェース名を含む文字列を指定します。
stroid
ObjectIdを文字列形式で指定します。ObjectIdは、クラスのこのインスタンスを一意に識別します。プログラマは、ObjectIdに指定する情報を決めます。一例として、データベース・キーの保持に使用する方法があります。オブジェクト識別子の値を選択、つまり一意性のレベルを決定することは、アプリケーション・デザインの一環です。Oracle Tuxedoソフトウェアでは、オブジェクト参照の一意性は保証されません。オブジェクト参照を文字列化する場合など、オブジェクト参照をコピーしたり、Oracle Tuxedo環境の外で共有したりすることがあるからです。
servant
アプリケーションですでに作成して初期化したサーバントに対するポインタです。
例外:
TobjS::InvalidInterface
指定されたinterfaceNameがNULLであることを示します。
TobjS::InvalidObjectId
指定されたstroidがNULLであることを示します。
TobjS::ServantAlreadyActive
サーバントが別のObjectIdですでに使用されているため、オブジェクトを明示的にアクティブ化できませんでした。サーバントは、単一のObjectIdでのみ使用できます。別のObjectIdを含むオブジェクトを事前にアクティブ化するには、アプリケーションが複数のサーバントを作成し、ObjectIdごとに1つずつ事前にアクティブ化する必要があります。
TobjS::ObjectAlreadyActive
ObjectIdがすでにアクティブ・オブジェクト・マップで使用されているため、オブジェクトを明示的にアクティブ化できませんでした。ある特定のObjectIdには、1つのサーバントしか関連付けられません。別のサーバントに変更するには、アプリケーションでまずオブジェクトを事前アクティブ化してからもう一度アクティブ化する必要があります。
TobjS::IllegalOperation
オブジェクトにプロセス・バウンド・アクティブ化ポリシーが設定されていないので、オブジェクトを明示的にアクティブ化することができませんでした。
説明
このメソッドでは、オブジェクト参照を作成し、オブジェクトを事前アクティブ化します。作成されたオブジェクト参照は、オブジェクトへのアクセスで使用するクライアントに渡されます。
通常、アプリケーションではこのメソッドを以下の2か所で呼び出します。
Server::initialize()内。最初の呼出しでアクティブ化しなくて済むように、プロセス・オブジェクトを事前アクティブ化します。
このメソッドを使用すると、アプリケーションでは最初の呼出しの前にオブジェクトをアクティブ化できます。(この処理が必要となる理由は、「明示的なアクティブ化」という項を参照してください。)ユーザーはまずサーバントを作成し、状態を設定してから、create_active_object_referenceを呼び出します。TPフレームワークでは、サーバントおよびObjectId文字列をアクティブ・オブジェクト・マップに入れます。その結果、TPフレームワークですでにServer::create_servantを呼び出し、サーバント・ポインタを受け取ってから、servant::activate_objectを呼び出した場合とまったく同じ状態になります。
アクティブ化されたオブジェクトは、プロセス・バウンド・アクティブ化ポリシーで宣言されたインタフェース用でなければなりません。それ以外の場合、例外が発生します。
オブジェクトを非アクティブ化すると、クライアントで保持されていたオブジェクト参照を使用して、そのオブジェクトを他のプロセスでアクティブ化できます。この処理が問題となる状況の詳細は、「明示的なアクティブ化」という項を参照してください。
注意:
ユーザー制御の同時実行性ポリシー・オプションがICFファイルで設定されている場合、このメソッドに関する制約が1つあります(「パラレル・オブジェクト」を参照してください)。TP::create_active_object_referenceメソッドは、ユーザー制御の同時実行性が設定されたインタフェースを渡されると、TobjS::IllegalOperation例外をスローします。AOMはユーザー制御の同時実行性が設定されている場合に使用されないので、TPフレームワークにはアクティブ化されたオブジェクトをこのサーバーに接続する方法がありません。
注意
インタフェースのオブジェクトを事前アクティブ化する場合、そのインタフェースのICFファイルでprocessアクティブ化ポリシーを指定する必要があります。ただし、ICFファイルのインタフェースについてprocessアクティブ化ポリシーを指定すると、次の問題が発生する可能性があります。
問題
1.
2.
3.
対策
この問題を防ぐには、管理者がSERVER1とSERVER2をそれぞれ別のグループとして構成します。グループを定義するには、UBBCONFIGファイルのSERVERSセクションを使用します。
戻り値
新しく作成されたオブジェクト参照。
TP::create_object_reference()
概要
オブジェクト参照を作成します。作成されたオブジェクト参照は、オブジェクトへのアクセスで使用するクライアントに渡されます。
C++バインディング
static CORBA::Object_ptr TP::create_object_reference (
const char* interfaceName,
const
char* stroid,
CORBA::NVList_ptr criteria);
引数
interfaceName
オブジェクトの完全修飾インタフェース名を含む文字列を指定します。
インタフェース名は、次のインタフェース・タイプ・コードID関数を呼び出すことで取得できます。
const char* _tc_<CORBA interface name>::id();
ここで、<CORBA interface name>は任意のオブジェクト・クラス名です。例:
char* idlname = _tc_Simple->id();
stroid
ObjectIdを文字列形式で指定します。ObjectIdは、クラスのこのインスタンスを一意で識別します。ObjectIdに指定する情報を決めるのは、プログラマの裁量です。一例として、ObjectIdをデータベース・キーの保持に使用する方法があります。オブジェクト識別子の値を選択、つまり一意性のレベルを決定することは、アプリケーション・デザインの一環です。Oracle Tuxedoソフトウェアでは、オブジェクト参照の一意性は保証されません。というのは、オブジェクト参照を文字列として渡す場合など、オブジェクト参照をコピーしたり、Oracle Tuxedoドメインの外で共有したりすることがあるからです。オブジェクト参照での呼出しを並列実行できるように、一意のObjectIdを選択することを強くお薦めします。
注意:
このリリースでは、ObjectIdの長さに関する制約がなくなりました。
criteria
オブジェクト参照のファクトリ・ベース・ルーティングで使用する名前付き値のリストを指定します。リストはオプションで、CORBA::NVList型です。ファクトリ・ベース・ルーティングを使用するかどうかは任意であり、使用する場合はこの引数に依存します。ファクトリ・ベース・ルーティングを使用しない場合は、この引数に0(ゼロ)を渡します。
Oracle Tuxedoシステムの管理者は、UBBCONFIGファイルでルーティング規則を指定して、ファクトリ・ベース・ルーティングを構成します。この機能の詳細は、オンライン・ドキュメントのOracle Tuxedoアプリケーションの設定を参照してください。
例外
create_object_reference()メソッドの例外は次のとおりです。
InvalidInterface
指定されたinterfaceNameがNULLであることを示します。
InvalidObjectId
指定されたstroidがNULLであることを示します。
説明
create_object_reference()メソッドの呼出しは、サーバー・アプリケーションの役割です。このメソッドによって、オブジェクト参照が作成されます。作成されたオブジェクト参照は、オブジェクトへのアクセスで使用するクライアントに渡されます。
通常、サーバー・アプリケーションではこのメソッドを以下の2か所で呼び出します。
Server::initialize()内。サーバーのファクトリを作成します。
create_object_reference()メソッドの呼出し方法とタイミングの例は、『CORBAサーバー・アプリケーションの作成』を参照してください。
戻り値
Object
新しく作成されたオブジェクト参照。
次のサンプル・コードは、criteria引数の使用方法を示しています。
CORBA::NVList_ptr criteria;
CORBA::Long branch_id = 7;
CORBA::Long account_id = 10001;
CORBA::Any any_val;
// Create the list and assign to _var to cleanup on exit
CORBA::ORB::create_list (2, criteria);
CORBA::NVList_var criteria_var(criteria);
// Add the BRANCH_ID
any_val <<= branch_id;
criteria->add_value("BRANCH_ID", any_val, 0);
// Add the ACCOUNT_ID
any_val <<= account_id;
criteria->add_value("ACCOUNT_ID", any_val, 0);
// Create the object reference.
TP::create_object_reference ("IDL:BankApp/Teller:1.0",
"Teller_01", criteria);
TP::deactivateEnable()
概要
CORBAオブジェクトのアプリケーション制御の非アクティブ化を有効にします。
C++バインディング
current-object形式:
static void TP::deactivateEnable();
any-object形式:
static void TP::deactivateEnable(
const char* interfaceName,
const char* stroid,
Tobj_Servant servant);
引数
interfaceName
オブジェクトの完全修飾インタフェース名を含む文字列を指定します。
stroid
非アクティブ化するオブジェクトのObjectIdを文字列形式で指定します。
servant
stroidに関連付けられたサーバントに対するポインタ。
例外
deactivateEnable()メソッドの例外は次のとおりです。
IllegalOperation
TP::deactivateEnableメソッドが、アクティブ化ポリシーをtransactionに設定されたオブジェクトによって呼び出されたことを示します。
TobjS::ObjectNotActive
any-object形式では、指定されたオブジェクトは非アクティブ化されていなかった、つまり、stroidおよびservantパラメータはアクティブ・オブジェクト・マップ内でオブジェクトを識別できなかったため、アクティブ化できませんでした。
説明
このオブジェクトを使用すると、同時実行されているオブジェクト(オブジェクトを呼び出したメソッドの終了時)、または別のオブジェクトを非アクティブ化できます。このメソッドは、プロセス・バウンド・アクティブ化ポリシーが設定されたオブジェクトに対してのみ使用できます。このメソッドにより、processアクティブ化ポリシーが設定されたオブジェクトをさらに柔軟に扱うことができます。
注意:
シングル・スレッド・サーバーの場合、TP::deactivateEnable(interface, object id, servant)メソッドを使用すると、オブジェクトを非アクティブ化できます。ただし、オブジェクトがトランザクションに参加している場合、オブジェクトが非アクティブ化されるのは、トランザクションがコミットまたはロールバックしたときです。トランザクションがコミットまたはロールバックする前にオブジェクトに対して呼出しが行われた場合、オブジェクトは非アクティブ化されません。
必要な動作が確実に実行されるようにするには、オブジェクトがトランザクションに参加していないことを確認するか、TP::deactivateEnable()を呼び出してからトランザクションが終了するまでオブジェクトに対して呼出しが行われないようにします。
注意:
マルチスレッド・サーバーでは、オブジェクトごとのサーバーでオブジェクトを非アクティブにするためのTP::deactivateEnable(interface, object id, servant)メソッドの使用はサポートされません。このメソッドは、リクエストごとのサーバーでのオブジェクトの非アクティブ化ではサポートされますが、他のスレッドがオブジェクトを操作しているために非アクティブ化が遅延することがあります。
呼び出されるオーバーロード関数の種類によって、操作は次のようになります。
current-object形式
プロセス・バウンド・アクティブ化ポリシーが設定されたオブジェクトのメソッド内から呼び出された場合、実行中のオブジェクトは、メソッドの実行が終了した後に非アクティブ化されます。
methodアクティブ化ポリシーが設定されたオブジェクトのメソッド内から呼び出された場合、こうしたオブジェクトの通常の動作(事実上NOOP)と同じ効果があります。
オブジェクトが非アクティブ化されると、TPフレームワークではまずアクティブ・オブジェクト・マップからオブジェクトが削除されます。次に、理由コードDR_METHOD_ENDを使用して、オブジェクトに関連付けられたサーバントのdeactivate_objectメソッドが呼び出されます。
any-object形式
アプリケーションでは、ObjectIdと関連付けられたサーバントを指定することで、オブジェクトの非アクティブ化をリクエストします。
オブジェクトが実行中の場合、TPフレームワークでは非アクティブ化対象としてオブジェクトをマークして、current-object形式と同じように、オブジェクトのメソッドが終了するまで待機してから非アクティブ化します。オブジェクトが実行中でない場合、TPフレームワークではただちにオブジェクトを非アクティブ化できます。非アクティブ化のステータスは、呼出し側に通知されません。オブジェクトが非アクティブ化されると、TPフレームワークではまずアクティブ・オブジェクト・マップからオブジェクトが削除されます。次に、理由コードDR_EXPLICIT_DEACTIVATEを使用して、オブジェクトに関連付けられたサーバントのdeactivate_objectメソッドが呼び出されます。
非アクティブ化をリクエストされたオブジェクトにtransactionアクティブ化ポリシーが設定されていた場合、IllegalOperation例外が発生します。これは、こうしたオブジェクトを非アクティブ化すると、Oracle Tuxedoトランザクション・マネージャからのトランザクション終了の通知と競合する場合があるからです。
戻り値
なし。
TP::get_object_id ()
概要
サーバーが、TPフレームワークで作成されたオブジェクト参照からObjectId文字列を取り出せるようにします。
C++バインディング
char* TP::get_object_id(Corba::Object_ptr obj);
引数
obj
ObjectIdを取り出すオブジェクト参照。
例外
TobjS::InvalidObject
オブジェクトがnilであるか、TPフレームワークで作成されていません。
説明
このメソッドを使用すると、サーバーが、TPフレームワークで作成されたオブジェクト参照からObjectId文字列を取り出すことができます。オブジェクト参照がクライアントORBなどによって作成され、TPフレームワークで作成されていない場合、例外が発生します。
呼出し側では、オブジェクト参照が不要になった場合に、戻り値に対してCORBA::string_freeを呼び出す必要があります。
戻り値
オブジェクト参照の作成時にTP::create_object_referenceまたはTP::create_active_object_referenceに渡されたObjectId文字列。
TP::get_object_reference()
概要
現在のオブジェクトへのポインタを返します。
C++バインディング
static CORBA::Object_ptr TP::get_object_reference ();
引数
なし。
get_object_reference()Server::initialize()またはServer::release()内から呼び出された場合、アプリケーションのTPオブジェクトの実行スコープ外で呼び出されたものとみなされるため、TobjS::NilObject例外が発生します。
例外
get_object_reference()メソッドの例外は次のとおりです。
NilObject
メソッドが、アプリケーションのCORBAオブジェクトの実行スコープ外で呼び出されたことを示します。reason文字列には、OutOfScopeが格納されます。
説明
このメソッドは、現在のオブジェクトへのポインタを返します。返されたCORBA::Object_ptrポインタは、クライアントに渡すことができます。
戻り値
CORBAオブジェクトの実行スコープ内で呼び出された場合、get_object_reference()メソッドは、現在のオブジェクトのCORBA::Object_ptrを返します。それ以外の場合、TobjS::NilObject例外が発生します。
TP::open_xa_rm()
概要
呼出しプロセスのリンク先のXAリソース・マネージャを開きます。
C++バインディング
static void TP::open_xa_rm();
引数
なし。
例外
Tobj::RMFailed
tx_open()呼出しによって、エラー戻りコードが返されました。
注意:
TPフレームワークによって返されるその他の例外とは異なり、この例外は、TobjS_c.h (TobjS.idlから派生)ではなく、tobj_c.h (tobj.idlから派生)で定義されます。これは、ネイティブ・クライアントでもXAリソース・マネージャを開けるからです。したがって、返される例外は、ネイティブ・クライアント・コードおよびServer::release() (ネイティブ・クライアントと共有される代替メカニズムであるTransactionCurrent::close_xa_rmを使用している場合)で想定される例外と一致します。
説明
open_xa_rm()メソッドは、呼出しプロセスのリンク先のXAリソース・マネージャを開きます。XAリソース・マネージャは、OracleやInformixなどのデータベース・ベンダーから提供されます。
注意:
このメソッドの機能は、Tobj::TransactionCurrent::close_xa_rm()によっても提供されます。ただし、TransactionCurrentオブジェクトのオブジェクト参照を取得する必要がないので、サーバー・アプリケーションでリソース・マネージャを開く方法としては、TP::open_xa_rm()メソッドを使う方がはるかに便利です。TransactionCurrentオブジェクトのリファレンスは、Bootstrapオブジェクトから取得できます。Bootstrapオブジェクトへの参照を取得する方法の詳細は、「TP::bootstrap()」を参照してください。TransactionCurrentオブジェクトの詳細は、「CORBAブートストラップ処理のプログラミング・リファレンス」という項と『CORBAトランザクションの使用』を参照してください。
グローバル・トランザクションに参加するサーバーごとにServer::initialize()メソッドから1回、このメソッドを呼び出す必要があります。グローバル・トランザクションに関与しているすべてのサーバーだけでなく、XAリソース・マネージャにリンクされたサーバーも含まれますが、XA準拠のリソース・マネージャに実際にはリンクされていません。
open_xa_rm()メソッドは、リソース・マネージャに固有のオープン呼出しのかわりに呼び出します。リソース・マネージャの初期化セマンティクスはそれぞれ異なるので、特定のリソース・マネージャを開くための情報を、UBBCONFIGファイルのGROUPSセクションにあるOPENINFOパラメータに指定します。
OPENINFO文字列の形式は、基礎となるリソース・マネージャを提供しているデータベース・ベンダーの要件によって異なります。CLOSEINFOパラメータの詳細は、Oracle Tuxedoアプリケーションの設定と、『ファイル形式、データ記述、MIBおよびシステム・プロセス・リファレンス』ubbconfig(5)のリファレンス・ページを参照してください。また、XAライブラリを使用するアプリケーションの開発およびインストール方法については、データベース・ベンダーのドキュメントを参照してください。
注意:
戻り値
なし。
TP::orb()
概要
ORBオブジェクトに対するポインタを返します。
C++バインディング
static CORBA::ORB_ptr TP::orb();
引数
なし。
例外
なし。
説明
ORBオブジェクトにアクセスすると、アプリケーションでは、string_to_object()object_to_string()などのORB操作を呼び出すことができます。
注意:
TPフレームワークがORBオブジェクトを所有しているため、アプリケーションで削除しないようにしてください。
戻り値
orb()は、正常に終了すると、サーバー・プログラムの開始時にTPフレームワークで作成されたORBオブジェクトに対するポインタを返します。
TP::register_factory()
概要
Oracle Tuxedo FactoryFinderオブジェクトを見つけて、Oracle Tuxedoファクトリを登録します。
C++バインディング
static void TP::register_factory(
CORBA::Object_ptr factory_or, const char* factory_id);
引数
factory_or
TP::create_object_reference()メソッドを使用して、アプリケーション・ファクトリ用に作成されたオブジェクト参照を指定します。
factory_id
アプリケーション・ファクトリを識別するための文字列識別子を指定します。この文字列を構成する際のヒントについては、『CORBAサーバー・アプリケーションの作成』を参照してください。
例外
register_factory()メソッドの例外は次のとおりです。
TobjS::CannotProceed
FactoryFinderが検索中に内部エラーに遭遇したことを示します。エラーは、ユーザー・ログ(ULOG)に書き込まれます。この例外が発生した場合は、すぐに作業担当者に通知してください。内部エラーの重大度によっては、FactoryFinderまたはNameManagerが実行されていたサーバーが終了していることがあります。FactoryFinderサービスが終了した場合は、新しいFactoryFinderサービスを開始します。NameManagerが終了しており、別のNameManagerが実行中である場合は、新規のNameManagerを開始します。稼動中のNameManagerがない場合は、アプリケーションを再起動します。
TobjS::InvalidName
id文字列が空であることを示します。フィールドに空白または制御文字が含まれている場合にも例外が発生します。
TobjS::InvalidObject
factory値がnilであることを示します。
TobjS::RegistrarNotAvailable
FactoryFinderオブジェクトがNameManagerを見つけることができないことを示します。この例外が発生した場合は、すぐに作業担当者に通知してください。稼働中のネーミング・サービス・サーバーがない場合は、アプリケーションを再起動します。
注意:
その他、FactoryFinderがトランザクションに参加できない場合にも、この例外が発生する場合があります。したがって、TP::register_factory()およびTP::unregister_factory()呼出しを発行する前に、現在のトランザクションを一時停止することが必要になる場合があります。トランザクションの一時停止と再開方法については、オンライン・マニュアルの『CORBAトランザクションの使用』を参照してください。
TobjS::OverFlow
id文字列が128バイト(許可されている最大長)より長いことを示します。
説明
このメソッドでは、Oracle Tuxedo FactoryFinderオブジェクトを見つけて、Oracle Tuxedoファクトリに登録します。通常、TP::register_factory()は、サーバーがファクトリを作成するときに、Server::initialize()から呼び出します。register_factory()メソッドでは、Oracle Tuxedo FactoryFinderオブジェクトを見つけて、Oracle Tuxedoファクトリに登録します。
注意:
戻り値
なし。
TP::unregister_factory()
概要
Oracle Tuxedo FactoryFinderオブジェクトを見つけて、ファクトリを削除します。
C++バインディング
static void TP::unregister_factory (
CORBA::Object_ptr factory_or, const char* factory_id);
引数
factory_or
TP::create_object_reference()メソッドを使用して、アプリケーション・ファクトリ用に作成されたオブジェクト参照を指定します。
factory_id
アプリケーション・ファクトリを識別するための文字列識別子を指定します。この文字列を構成する際のヒントについては、『CORBAサーバー・アプリケーションの作成』を参照してください。
例外
unregister_factory()メソッドの例外は次のとおりです。
CannotProceed
FactoryFinderが検索中に内部エラーに遭遇したことを示します。エラーは、ユーザー・ログ(ULOG)に書き込まれます。この例外が発生した場合は、すぐに作業担当者に通知してください。内部エラーの重大度によっては、FactoryFinderまたはNameManagerが実行されていたサーバーが終了していることがあります。FactoryFinderサービスが終了した場合は、新しいFactoryFinderサービスを開始します。NameManagerが終了しており、別のNameManagerが実行中である場合は、新規のNameManagerを開始します。稼動中のNameManagerがない場合は、アプリケーションを再起動します。
InvalidName
id文字列が空であることを示します。フィールドに空白または制御文字が含まれている場合にも例外が発生します。
RegistrarNotAvailable
FactoryFinderオブジェクトがNameManagerを見つけることができないことを示します。この例外が発生した場合は、すぐに作業担当者に通知してください。稼働中のネーミング・サービス・サーバーがない場合は、アプリケーションを再起動します。
注意:
その他、FactoryFinderがトランザクションに参加できない場合にも、この例外が発生する場合があります。したがって、TP::register_factory()およびTP::unregister_factory()呼出しを発行する前に、現在のトランザクションを一時停止することが必要になる場合があります。トランザクションの一時停止と再開方法については、オンライン・マニュアルの『CORBAトランザクションの使用』を参照してください。
TobjS::OverFlow
id文字列が128バイト(許可されている最大長)より長いことを示します。
説明
このメソッドは、Oracle Tuxedo FactoryFinderオブジェクトを探し、ファクトリを削除します。通常、TP::unregister_factory()は、サーバー・ファクトリを登録解除するためにServer::release()から呼び出されます。
戻り値
なし。
TP::userlog()
概要
ユーザー・ログ(ULOG)ファイルにメッセージを書き込みます。
C++バインディング
static int TP::userlog(char*, ...);
引数
最初の引数では、printf(3S)スタイルの形式を指定します。printf(3S)引数については、CまたはC++リファレンス・マニュアルで説明されています。
例外
なし。
説明
userlog()メソッドは、ユーザー・ログ(ULOG)ファイルにメッセージを書き込みます。メッセージは、時刻(hhmmss)、システム名、プロセス名、および呼出しプロセスのプロセスIDで構成されるタグを付けて、ULOGファイルに追加されます。タグの最後にはコロンが付けられます。
サーバー・アプリケーションでは、userlog()によるメッセージをアプリケーション・エラーのデバッグで有用となるメッセージに限定することをお薦めします。ULOGが重要度の低いメッセージでいっぱいになると、実際のエラーの特定が難しくなります。
戻り値
userlog()メソッドは、出力された文字数を返し、出力エラーが発生した場合には、負の値を返します。出力エラーには、現在のログ・ファイルのオープン・エラーや書込みエラーがあります。
次のサンプル・コードは、TP::userlog()メソッドの使用方法を示しています。
userlog (“System exception caught: %s", e.get_id());
CosTransactions::TransactionalObjectインタフェース(任意)
このインタフェースの使用は非推奨になりました。このインタフェースの使用は任意となったため、トランザクションに関与するオブジェクトに対して、このインタフェースの下位インタフェースを使用する必要はありません。プログラマは、neverまたはignoreトランザクション・ポリシーを指定して、オブジェクトがトランザクションに関与しないように指定できます。トランザクションの処理にインタフェースを使用する必要はありません。指定するのはトランザクション・ポリシーだけです。
注意:
エラー、例外、およびエラー・メッセージ
TPフレームワークで生成される例外
TPフレームワークでは以下の例外が発生します。発生した例外は、エラーが発生したクライアントに返されるか、TPで検出されます。
CORBA::INTERNAL
CORBA::OBJECT_NOT_EXIST
CORBA::OBJ_ADAPTER
CORBA::INVALID_TRANSACTION
CORBA::TRANSACTION_ROLLEDBACK
これらの例外の理由は明確ではないので、TPフレームワークでは、例外が発生するたびに、理由を示すエラー・メッセージがユーザー・ログ・ファイルに書き込まれます。
サーバー・アプリケーション・コード内の例外
クライアントによって呼び出されたメソッド内で発生した例外は、クライアントによって呼び出されたメソッドで発生した例外と同じように、クライアントに返されます。
TPフレームワークの以下のコールバック・メソッドは、オブジェクトに対するクライアントのリクエスト以外のイベントによって開始されます。
Tobj_ServantBase::activate_object()
Tobj_ServantBase::deactivate_object()
Server::create_servant()
これらのメソッドで例外条件が発生した場合、まったく同じ例外がクライアントに通知されるわけではありません。ただし、これらの各メソッドは、reason文字列を含む例外を生成するように定義されています。TPフレームワークでは、コールバックによって生成された例外が捕捉され、reason文字列がユーザー・ログ・ファイルに書き込まれます。TPフレームワークでは、クライアントに例外を返すこともできます。これらの例外の詳細は、TPフレームワークの個別のコールバック・メソッドの説明を参照してください。
Tobj_ServantBase::deactivate_object()の場合、次のコードはDeactivateObjectFailed例外をスローします。
throw TobjS::DeactivateObjectFailed( “deactivate failed to save
state!”);
このメッセージは、時刻(hhmmss)、システム名、プロセス名、および呼出しプロセスのプロセスIDで構成されるタグを付けて、ユーザー・ログ・ファイルに追加されます。タグの最後にはコロンが付けられます。前述のthrow文によって、次の行がユーザー・ログ・ファイルに書き込まれます。
151104.T1!simpapps.247: APPEXC: deactivate failed to save state!
151104は時刻(3:11:04pm)、T1はシステム名、simpappsはプロセス名、247はプロセスIDをそれぞれ示し、APPEXCはメッセージがアプリケーション例外メッセージであることを示します。
例外とトランザクション
CORBAオブジェクト・メソッドまたはTPフレームワークのコールバック・メソッドで例外が発生しても、TPフレームワークがトランザクションを開始していないかぎり、トランザクションは自動的にはロールバックされません。例外が発生した条件に基づいてトランザクションをロールバックする場合は、アプリケーション・コードでCurrent.rollback_only()を呼び出す必要があります。
CORBAオブジェクトに対するネストされた呼出しに関する制約
TPフレームワークには、CORBAオブジェクトに対するネストされた呼出しに関して制約があります。制約の内容は次のとおりです。
TPフレームワークでは、別のCORBAオブジェクトがすでにメソッド呼出しを処理しているオブジェクトのクライアントとして機能していることを検出すると、呼出し側にCORBA::OBJ_ADAPTER例外を返します。
注意:
 

1
理論上は、同じプロセスのトランザクションCORBAオブジェクトに対する呼出しは、新しいプロセスをトランザクション・マネージャに登録する必要がないため、有効となります。ただし、CORBAオブジェクトに対する呼出しがインプロセスで確実に発生するようにプログラミングすることはできないため、このような手法はお薦めしません。

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved