•
|
CREDIT - 指定された金額(ドル)を口座に振り込みます
|
•
|
DEBIT - 指定された金額(ドル)を口座から引き落とします
|
Tellerオブジェクトのこれらの各操作は、Oracle Tuxedo ATMI Tellerアプリケーションにあるサービスへの呼出しと1対1でマップされています。
Tellerオブジェクトの一般的な使用シナリオは、次のようになります。
2.
|
登録プロセスの一部として、Registrarオブジェクトによって Tellerオブジェクトの get_balance()操作が呼び出されて、口座番号が渡されます。
|
3.
|
Tellerオブジェクトの get_balance()操作によって、口座番号がメッセージ・バッファに格納され、このバッファがOracle Tuxedo ATMI Tellerアプリケーションの CURRBALANCEサービスに送信されます。
|
5.
|
CURRBALANCEサービスによって、口座の現在の残高がUniversityデータベースから取得されて、Oracle Tuxedo ATMI Tellerアプリケーションに渡されます。
|
7.
|
Tellerオブジェクトによって、現在の残高の合計がメッセージ・バッファから取り出されたうえで、現在の残高が Registrarオブジェクトに返されます。
|
次の例に、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;
}
次の文は、tpcallの実装を通じて
CURRBALANCE Oracle Tuxedoサービスを呼び出し、メッセージ・バッファを渡します。また、この文は、Oracle Tuxedoサービスのレスポンスが格納される場所も指定します。この例では、リクエストの送信元となったバッファと同じバッファです。
get_balance()操作の最後の行で、クライアント・アプリケーションへ結果が返されます。
•
|
University。RegistrarFactory、 Registrarおよび CourseSynopsisEnumeratorオブジェクトがあります
|
•
|
Billing。TellerFactoryおよび Tellerオブジェクトがあります
|
•
|
Tellerオブジェクト上で get_balance()操作を呼び出して取得される、データベースの口座表からの学生の残高
|
•
|
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オブジェクトは同一のトランザクション内にスコープ指定されているため、このロールバックは、登録プロセスの全体に影響することで、データベースの不整合(たとえば、学生がコースに登録したのに、学生の口座残高からコースの分が引き落とされていないなど)を防ぎます。
•
|
TellerFactoryオブジェクトの操作は、 find_teller()のみです。 find_teller() 操作の機能は、Universityサーバーの RegistrarFactoryオブジェクトにおける find_registrar()操作の機能と全く同じです。
|
•
|
Tellerオブジェクト。前述のように、このオブジェクトは次の操作を実装します。
|
Registrarオブジェクトと同様に、
Tellerオブジェクトには状態データがなく、一意のオブジェクトID (OID)もありません。
•
|
Registrarオブジェクトには、請求操作を処理する Tellerオブジェクトへリクエストを送信する方法が必要です。
|
1.
|
Registrarオブジェクトが、 CourseSynopsisEnumeratorオブジェクトへのオブジェクト参照を作成します。
|
3.
|
CourseSynopsisEnumeratorオブジェクトがメモリーに存在しない場合は、TPフレームワークがサーバー・オブジェクトの Server::create_servant()操作を呼び出して、 CourseSynopsisEnumeratorオブジェクトをインスタンス化します。
|
•
|
Universityサーバー・アプリケーションは、Universityサーバー・オブジェクトのServer::initialize()操作にある TellerFactoryオブジェクトへのオブジェクト参照を取得します。次に、Universityサーバー・アプリケーションは TellerFactoryへのオブジェクト参照をキャッシュします。これにより、 Registrarオブジェクトが TellerFactoryオブジェクトを必要とするたびに次の処理を実行せずに済むため、パフォーマンスの最適化に貢献します。
|
•
|
コース登録プロセス中に請求を処理するために、Registrarオブジェクトの register_for_courses()および get_student_details()操作は、 Tellerオブジェクトの操作を呼び出すコードを含むように変更されます。
|