目次 前 次 PDF


Oracle TuxedoサービスのCORBAオブジェクトへのラッピング

Oracle TuxedoサービスのCORBAオブジェクトへのラッピング
この章では、Wrapperサンプル・アプリケーションを例にして、CORBAサーバー・アプリケーションによって管理されているオブジェクトの内部からOracle Tuxedoサービスを呼び出す方法の1つを概説します。
このトピックには次の項が含まれます:
この項では、次の内容について説明します。
Wrapperサンプル・アプリケーションは、一連の請求操作をOracle Tuxedo ATMI Tellerアプリケーション(基本的な請求手続きを実行する一連のサービスが含まれる)に委任します。この章で紹介するアプローチは、Oracle TuxedoアプリケーションをOracle Tuxedoドメインに組み込むテクニックの一例です。
この章で示されている例では、CORBAオブジェクトの操作と、アプリケーション内の特定のサービスへの呼出しとの1対1の対応が示されます。つまり、Oracle Tuxedoサービスへの呼出しがCORBAオブジェクトの操作としてラッピングされるともいえます。これは、オブジェクトが処理機能をOracle Tuxedoアプリケーションに委任することです。一連のOracle TuxedoサービスをCORBAサーバー・アプリケーションで使用する必要がある場合は、この章で示されるテクニックが役立つ場合があります。
この章では、Oracle Tuxedo ATMIアプリケーションの詳細は説明しません。Oracle Tuxedo ATMIアプリケーションをビルドおよび構成する方法、および動作の詳細は、Oracle Tuxedoのオンライン・マニュアルに含まれているOracle Tuxedo ATMIの情報を参照してください。
Oracle Tuxedoサービスのラッピングの概要
この章で説明される、Oracle Tuxedoサービスのセットをラッピングする処理には以下のステップがあります。
1.
2.
3.
次の図は、クライアント・アプリケーション、CORBAサーバー・アプリケーションに管理されているCORBAオブジェクト、およびOracle Tuxedo ATMIアプリケーションの間の関係を簡単に示します。Oracle Tuxedo ATMIアプリケーションは、CORBAオブジェクトから呼び出されるサービスを実装します。
Oracle Tuxedoサービスをラッピングするオブジェクトの設計
この章で説明する最初のステップは、Oracle Tuxedo ATMIアプリケーションへの呼出しをラッピングするオブジェクトの設計です。たとえば、Wrapperサンプル・アプリケーションの目的は、学生の登録プロセスに請求機能を追加することで、これは既存のOracle Tuxedo ATMI Tellerアプリケーションに一連の請求操作を委任すれば実現できます。
Wrapperサンプル・アプリケーションで使用されているOracle Tuxedo ATMI Tellerアプリケーションには、次のサービスが含まれています。
CURRBALANCE - 指定された口座の現在の残高を取得します
CREDIT - 指定された金額(ドル)を口座に振り込みます
DEBIT - 指定された金額(ドル)を口座から引き落とします
これらのサービスをラッピングするために、Wrapperサンプル・アプリケーションには新しいインタフェースTellerを定義する別個のOMG IDLファイルが含まれています。このインタフェースには、次の操作があります。
Tellerオブジェクトのこれらの各操作は、Oracle Tuxedo ATMI Tellerアプリケーションにあるサービスへの呼出しと1対1でマップされています。
Tellerオブジェクトの一般的な使用シナリオは、次のようになります。
1.
クライアント・アプリケーションによってRegistrarオブジェクトのregister_for_courses()操作が呼び出されて、このときに学生IDが要求されます。
2.
登録プロセスの一部として、RegistrarオブジェクトによってTellerオブジェクトのget_balance()操作が呼び出されて、口座番号が渡されます。
3.
Tellerオブジェクトのget_balance()操作によって、口座番号がメッセージ・バッファに格納され、このバッファがOracle Tuxedo ATMI TellerアプリケーションのCURRBALANCEサービスに送信されます。
4.
5.
CURRBALANCEサービスによって、口座の現在の残高がUniversityデータベースから取得されて、Oracle Tuxedo ATMI Tellerアプリケーションに渡されます。
6.
7.
Tellerオブジェクトによって、現在の残高の合計がメッセージ・バッファから取り出されたうえで、現在の残高がRegistrarオブジェクトに返されます。
TellerオブジェクトおよびWrapperサンプル・アプリケーションの設計の詳細は、-7ページの「Wrapperサンプル・アプリケーションの設計上の考慮事項」という項を参照してください。
Oracle Tuxedoサービス呼出しをカプセル化するバッファの作成
この章で説明する次のステップは、メッセージがオブジェクトとOracle Tuxedoサービスとの間で送信されるバッファの作成です。様々なOracle Tuxedo ATMIアプリケーションで使用可能なバッファ型は複数あり、この章の例はFMLバッファ型に基づいています。Oracle Tuxedoシステムのバッファ型の詳細は、Oracle Tuxedoの情報を参照してください。
使用するアプリケーション実装ファイルで、選択したバッファ・タイプを割り当てる必要があります。割り当てるバッファは特定のTellerオブジェクト・インスタンスについて一意である必要がないため、オブジェクトのコンストラクタで割り当てることができます。この割当ての操作には、一般に、バッファ・タイプの指定、Oracle Tuxedoサービスへのプロシージャ・コールに適した任意のフラグの受渡し、バッファ・サイズの指定などが含まれます。
また、使用する実装のヘッダー・ファイルには、バッファを表す変数の定義を追加する必要もあります。
次のサンプル・コードではWrapperアプリケーションのTellerオブジェクトのコンストラクタに、Oracle Tuxedoのバッファm_tuxbufが割り当てられています。
Teller_i::Teller_i() :
m_tuxbuf((FBFR32*)tpalloc("FML32", "", 1000))
{
if (m_tuxbuf == 0) {
throw CORBA::INTERNAL();
}
}
FMLバッファを割り当てる行については、次のことに注意してください。
 
また、オブジェクトの実装ファイルは、Wrapperアプリケーションの実装ファイルにある次の文のようにして、デストラクタでバッファの割当てを解除する必要があります。
tpfree((char*)m_tuxbuf);
Oracle Tuxedoサービスとの間でメッセージを送信する操作の実装
次のステップは、Oracle Tuxedo ATMIアプリケーションへの呼出しをラッピングするオブジェクトでの操作を実装することです。このステップでは、オブジェクトからOracle Tuxedoサービスを呼び出す方法の実装を選択します。Wrapperサンプル・アプリケーションでは、tpcall実装が使用されます。
Oracle Tuxedoサービスをラッピングするオブジェクトでの操作には、次のことをする文が一般に含まれます。
a.
b.
c.
d.
次の例に、WrapperアプリケーションのTellerオブジェクトでのget_balance()操作の実装を示します。この操作では特定の口座の残高が取得され、Oracle TuxedoサービスCURRBALANCEが呼び出されます。
CORBA::Double Teller_i::get_balance(BillingW::AccountNumber account)
{
// "marshal" the "in" parameters (account number)
Fchg32(m_tuxbuf, ACCOUNT_NO, 0, (char*)&account, 0);
long size = Fsizeof32(tuxbuf);
// Call the CURRBALANCE Tuxedo service
if (tpcall("CURRBALANCE", (char*)tuxbuf, 0,
(char**)&tuxbuf, &size, 0) ) {
throw CORBA::PERSIST_STORE();
}
// "unmarshal" the "out" parameters (current balance)
CORBA::Double currbal;
Fget32(m_tuxbuf, CURR_BALANCE, 0, (char*)&currbal, 0);
return currbal;
}
次のサンプル・コードにある文は、メッセージ・バッファm_tuxbufを学生の口座番号で満たします。FMLの詳細は、『Oracle Tuxedo ATMI FML関数リファレンス』を参照してください。
Fchg32(m_tuxbuf, ACCOUNT_NO, 0, (char*)&account, 0);
次の文は、tpcallの実装を通じてCURRBALANCE Oracle Tuxedoサービスを呼び出し、メッセージ・バッファを渡します。また、この文は、Oracle Tuxedoサービスのレスポンスが格納される場所も指定します。この例では、リクエストの送信元となったバッファと同じバッファです。
if (tpcall("CURRBALANCE", (char*)tuxbuf, 0,
(char**)&tuxbuf, &size, 0) ) {
throw CORBA::PERSIST_STORE();
}
次の文は、返されたOracle Tuxedoメッセージ・バッファから残高を取り出します。
Fget32(m_tuxbuf, CURR_BALANCE, 0, (char*)&currbal, 0);
get_balance()操作の最後の行で、クライアント・アプリケーションへ結果が返されます。
return currbal;
制約
Oracle Tuxedoドメイン内にOracle Tuxedoサービスを組み込む方法については、次の制限事項に注意してください。
Oracle Tuxedoサービスを呼び出すオブジェクト内にtpreturn()またはtpforward()のOracle Tuxedo実装を含めることはできません。
Wrapperサンプル・アプリケーションの設計上の考慮事項
Wrapperサンプル・アプリケーションの基本的な設計上の考慮事項は、この項で説明するシナリオに基づいています。学生がコースを登録するとき、Registrarオブジェクトが登録プロセスの一部としてTellerオブジェクトの呼出しを実行し、Tellerオブジェクトは学生の口座にコースの課金をします。
ここでは、Wrapperサンプル・アプリケーションの設計について説明し、Billingというサーバー・アプリケーションを構成に追加します。このため、Wrapperサンプル・アプリケーションは次の4つのサーバー・アプリケーションで構成されます。
University。RegistrarFactoryRegistrarおよびCourseSynopsisEnumeratorオブジェクトがあります
Billing。TellerFactoryおよびTellerオブジェクトがあります
Oracle Tuxedo ATMI Tellerアプリケーション。CURRBALANCECREDITおよびDEBITサービスがあります
さらに、Wrapperサンプル・アプリケーションのUBBCONFIGファイルで、次のグループが指定されます。
次の図に、Wrapperサンプル・アプリケーションでのOracle Tuxedoドメインの構成を示します。
Oracle Tuxedo ATMIアプリケーションをUniversityサンプル・アプリケーションに組み込むことは、Process-Entityデザイン・パターンを使用する観点からは合理的です。一般にOracle Tuxedo ATMIアプリケーションはProcess-Entityデザイン・パターンを実装しますが、このデザイン・パターンはUniversityサンプル・アプリケーションでも使用されています。
Universityデータベースは、各学生の口座情報が格納されている新しい表を含めるように更新されます。このため、Oracle Tuxedo ATMI Tellerアプリケーションのサービスで課金データを処理する際には、Universityデータベースを使用してトランザクションが実行されます。
Wrapper Universityサンプル・アプリケーションのしくみ
Wrapperサンプル・アプリケーションでの一般的な使用シナリオでは、以下のようなイベントのシーケンスを経ます。
1.
学生のログオン手続きの後で、クライアント・アプリケーションによってRegistrarオブジェクトのget_student_details()操作が呼び出されます。get_student_details()操作の実装に含まれているコードによって、次の内容が取得されます。
Tellerオブジェクト上でget_balance()操作を呼び出して取得される、データベースの口座表からの学生の残高
2.
3.
クライアント・アプリケーションは、Transactionサンプル・アプリケーションのシナリオと同様に、Registrarオブジェクトにリクエストを送信してregister_for_courses()操作を呼び出します。このリクエストにコース番号と学生IDのみが含められる点も同じです。
4.
学生ごとにコースのリストを登録する際に、register_for_courses()操作は次の処理を呼び出します。
Tellerオブジェクトのget_balance()操作。学生の口座に滞納がないことを確認します
Tellerオブジェクトのdebit()操作。Billingサーバー・アプリケーションによって管理され、コースの課金を実行します
5.
Tellerオブジェクトのget_balance()およびdebit()操作のそれぞれが、Oracle Tuxedo ATMI Tellerアプリケーションへのリクエストを送信します。このリクエストには、適切な呼出しが格納されたFMLバッファがカプセル化されています(これには、Oracle Tuxedo ATMI TellerアプリケーションのCURRBALANCEおよびDEBITサービスそれぞれへの口座番号呼出しも含まれます)。
6.
CURRBALANCEおよびDEBITサービスは、それぞれ、適切なデータベース呼出しを実行して、現在の残高を取得し、学生が登録したコースの課金を反映するように学生の口座から引き落とします。
学生の口座に滞納があれば、Registrarオブジェクトはクライアント・アプリケーションにDelinquentAccount例外を返します。その際、クライアント・アプリケーションはトランザクションをロールバックします。
debit()操作が失敗した場合、TellerオブジェクトはTransactionCurrentオブジェクトのrollback_only()操作を呼び出します。TellerおよびRegistrarオブジェクトは同一のトランザクション内にスコープ指定されているため、このロールバックは、登録プロセスの全体に影響することで、データベースの不整合(たとえば、学生がコースに登録したのに、学生の口座残高からコースの分が引き落とされていないなど)を防ぎます。
7.
例外が発生しなければ、Registrarオブジェクトによって学生は希望のコースに登録されます。
Billingサーバー・アプリケーションのインタフェース定義
以下のインタフェース定義が、Billingサーバー・アプリケーション用に定義されています。
TellerFactoryオブジェクトの操作は、find_teller()のみです。find_teller() 操作の機能は、UniversityサーバーのRegistrarFactoryオブジェクトにおけるfind_registrar()操作の機能と全く同じです。
Tellerオブジェクト。前述のように、このオブジェクトは次の操作を実装します。
Registrarオブジェクトと同様に、Tellerオブジェクトには状態データがなく、一意のオブジェクトID (OID)もありません。
Wrapperサンプル・アプリケーションの設計上の追加考慮事項
次の追加考慮事項が、Wrapperサンプル・アプリケーションの設計に影響します。
Registrarオブジェクトには、請求操作を処理するTellerオブジェクトへリクエストを送信する方法が必要です。
こうした両方の考慮事項により、Wrapperサンプル・アプリケーションのUBBCONFIGファイルが重要になります。以後の項では、これに関係する設計上の追加考慮事項を詳細に説明します。
Tellerオブジェクトへのリクエストの送信
ここまでは、Universityサーバー・アプリケーションのすべてのオブジェクトは同じサーバー・プロセス内で定義されていました。そのため、1つのオブジェクトが他のオブジェクトにリクエストを送信する処理は単純でした(この処理を、次のステップでRegistrarオブジェクトおよびCourseSynopsisEnumeratorオブジェクトを例にして示します)。
1.
Registrarオブジェクトが、CourseSynopsisEnumeratorオブジェクトへのオブジェクト参照を作成します。
2.
新しく作成されたオブジェクト参照を使用して、RegistrarオブジェクトはCourseSynopsisEnumeratorオブジェクトへのリクエストを送信します。
3.
CourseSynopsisEnumeratorオブジェクトがメモリーに存在しない場合は、TPフレームワークがサーバー・オブジェクトのServer::create_servant()操作を呼び出して、CourseSynopsisEnumeratorオブジェクトをインスタンス化します。
しかし、2つのサーバー・プロセスが実行中で、1つのプロセスにあるオブジェクトが2つ目のプロセスによって管理されているオブジェクトにリクエストを送信する必要がある場合、その手順は若干複雑です。たとえば、別のサーバー・プロセスにあるオブジェクトへのオブジェクト参照を取得するには、重要な前提があります。1つは、2つ目のサーバー・プロセスの実行中にリクエストを実行することです。さらに、別のサーバー・プロセスにあるオブジェクト用のファクトリが使用可能である必要があります。
Wrapperサンプル・アプリケーションでは、これを解決するために以下の構成および設計の要素を組み込んでいます。
Universityサーバー・アプリケーションは、Universityサーバー・オブジェクトのServer::initialize()操作にあるTellerFactoryオブジェクトへのオブジェクト参照を取得します。次に、Universityサーバー・アプリケーションはTellerFactoryへのオブジェクト参照をキャッシュします。これにより、RegistrarオブジェクトがTellerFactoryオブジェクトを必要とするたびに次の処理を実行せずに済むため、パフォーマンスの最適化に貢献します。
Bootstrapオブジェクトのresolve_initial_references()操作を呼び出して、FactoryFinderオブジェクトを取得します。
FactoryFinderオブジェクトのfind_one_factory_by_id()操作を呼び出して、TellerFactoryオブジェクトへの参照を取得します。
Billingサーバー・プロセスが、Universityサーバー・プロセスよりも先に開始されます。続いてRegistrarオブジェクトによってTellerFactoryオブジェクトが呼び出されるとき、RegistrarオブジェクトはServer::initialize()操作(前述のリスト項目で説明)によって取得されたオブジェクト参照を使用します。UBBCONFIGファイルで、各サーバー・プロセスの起動順序を指定します。
コース登録プロセス中に請求を処理するために、Registrarオブジェクトのregister_for_courses()およびget_student_details()操作は、Tellerオブジェクトの操作を呼び出すコードを含むように変更されます。
例外の処理
Wrapperサンプル・アプリケーションは、学生が支払う必要のある金額が許可された限度を超えている状況を処理できるように設計されています。Universityで許可されている以上の借りが学生にある場合、その学生がコースを登録しようとすると、Registrarオブジェクトはユーザー定義のDelinquentAccount例外を生成します。この例外がクライアント・アプリケーションに戻されると、クライアント・アプリケーションによってトランザクションがロールバックされます。ユーザー定義の例外を実装する方法の詳細は、-17ページの「ユーザー定義の例外」という項を参照してください。
Wrapperサンプル・アプリケーションのインタフェースに対するトランザクション・ポリシーの設定
Wrapperサンプル・アプリケーションのパフォーマンスに影響するもう1つの考慮事項は、アプリケーションのオブジェクトのインタフェースに適したトランザクション・ポリシーを設定することです。RegistrarCourseSynopsisEnumeratorおよびTellerオブジェクトは、alwaysトランザクション・ポリシーによって構成されます。RegistrarFactoryおよびTellerFactoryオブジェクトはignoreトランザクション・ポリシーによって構成されます(トランザクションに含まれる必要のないこれらのオブジェクトには、トランザクションのコンテキストが伝播されないようになります)。
UniversityおよびBillingサーバー・アプリケーションの構成
前述のように、Billingサーバー・アプリケーションは、UniversityデータベースおよびUniversityアプリケーション、Oracle Tuxedo ATMI Tellerアプリケーション、およびOracleトランザクション・マネージャ・サーバー(TMS)アプリケーションを含むグループとは別のグループで構成されます。
しかし、Billingサーバー・アプリケーションは学生をコースに登録するトランザクションに参加するため、Billingサーバー・アプリケーションはサーバー・オブジェクトのTP::open_xa_rm()およびTP::close_xa_rm()操作への呼出しを含む必要があります。これは、任意のトランザクションに含まれるオブジェクトを管理するあらゆるサーバー・アプリケーションに対する要件です。そのようなオブジェクトがデータベースに対する読み取りまたは書込みの操作を一切実行しない場合は、次の場所にNULLリソース・マネージャを指定することができます。
UBBCONFIGファイル内の適切なグループ定義
Wrapperサンプル・アプリケーションのビルド、構成および実行の詳細は、『CORBA Universityサンプル・アプリケーション・ガイド』を参照してください。
 

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