|
|
CORBA クライアント・アプリケーションのトランザクション
ここでは、次の内容について説明します。
ここでは、BEA Tuxedo CORBA ソフトウェアの CORBA C++、Java、および ActiveX クライアント・アプリケーションでトランザクションを使用する方法を説明します。始める前に、トランザクションについてを読む必要があります。
注記 BEA Tuxedo では、CORBA インターオペラブル・ネーミング・サービス (INS) ブートストラップ処理メカニズムも使用できます。INS の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』の「CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。INS を使用する際の制限については、INS を使用するサード・パーティ・クライアントのサポートを参照してください。
作業クライアント・アプリケーションにトランザクションがインプリメントされるしくみの例については、BEA Tuxedo オンライン・マニュアルの「Transactions サンプル・アプリケーション」を参照してください。TransactionCurrent オブジェクトの概要については、『BEA Tuxedo CORBA クライアント・アプリケーションの開発方法』の「クライアント・アプリケーションの開発概念」を参照してください。
BEA Tuxedo CORBA トランザクションの概要
クライアント・アプリケーションは、トランザクション処理を使用してデータの有効性、一貫性、永続性を保証します。BEA Tuxedo ソフトウェアのトランザクションを使用すると、クライアント・アプリケーションはトランザクションを開始および終了し、トランザクションのステータスを取得できます。BEA Tuxedo ソフトウェアでは、CORBA のオブジェクト・トランザクション・サービスで定義されたトランザクションを使いやすいように拡張して使用します。
トランザクションは、インターフェイスで定義されます。アプリケーション設計者は、BEA Tuxedo クライアント/サーバ・アプリケーション内のどのインターフェイスでトランザクションを処理するかを指定します。インプリメンテーション・コンフィギュレーションファイル (ICF) で、各インターフェイスのトランザクション方針がサーバ・アプリケーション用に定義されます。一般に、使用可能なインターフェイスの ICF ファイルは、アプリケーション設計者からクライアント・プログラマに提供されます。
トランザクションの開発プロセスの概要
トランザクションをクライアント・アプリケーションに追加するには、以下の手順を実行します。
以下の節では、Transactions University サンプル・アプリケーションにあるクライアント・アプリケーションの一部を使用して、この手順を説明します。Transactions University サンプル・アプリケーションの詳細については、BEA Tuxedo オンライン・マニュアルの「Transactions サンプル・アプリケーション」を参照してください。
Transactions University サンプル・アプリケーションは、BEA Tuxedo ソフトウェア・キットの次のディレクトリにあります。
drive:
\tuxdir
\samples
\corba
\university
\transactions
drive:
/tuxdir/samples/corba/university/transactions
ステップ 1: Bootstrap オブジェクトを使用して TransactionCurrent オブジェクトを取得する
BEA Tuxedo CORBA クライアント・ソフトウェアを使用している場合、Bootstrap オブジェクトを使用し、指定した BEA Tuxedo ドメインで TransactionCurrent オブジェクトへのオブジェクト・リファレンスを取得します。TransactionCurrent オブジェクトの詳細については、『BEA Tuxedo CORBA クライアント・アプリケーションの開発方法』の「CORBA クライアント・アプリケーションの開発概念」を参照してください。
注記 サード・パーティ・クライアント ORB を使用している場合、CORBA インターオペラブル・ネーミング・サービス (INS) の CORBA::ORB::resolve_initial_references
オペレーションを使用して、BEA Tuxedo ドメインの FactoryFinder オブジェクトへのリファレンスを取得します。INS を使用してトランザクション・クライアントの初期オブジェクト・リファレンスを取得する方法の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』の「CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。
次の C++、Java、Visual Basic の例は、Bootstrap オブジェクトを使用して TransactionCurrent オブジェクトを返す方法を示します。
C++ の例
CORBA::Object_var var_transaction_current_oref =
Bootstrap.resolve_initial_references("TransactionCurrent");
CosTransactions::Current_var transaction_current_oref=
CosTransactions::Current::_narrow(
var_transaction_current_oref.in());
Java の例
org.omg.CORBA.Object transCurObj =
gBootstrapObjRef.resolve_initial_references(
"TransactionCurrent");
org.omg.CosTransactions.Current gTransCur=
org.omg.CosTransactions.CurrentHelper.narrow(transCurObj);
Visual Basic の例
Set objTransactionCurrent =
objBootstrap.CreateObject("Tobj.TransactionCurrent")
ステップ 2: TransactionCurrent メソッドを使用する
TransactionCurrent オブジェクトには、クライアント・アプリケーションでトランザクションを管理できるようにするメソッドがあります。これらのメソッドを使用すると、トランザクションを開始および終了して、現在のトランザクションに関する情報を取得できます。
注記 または、CORBA Java クライアントは、UserTransaction オブジェクトを代わりに使用することもできます。
表 4-1 では、TransactionCurrent オブジェクトのメソッドについて説明します。
基本的なトランザクションは、以下のように動作します。
Tobj::TransactionCurrent::begin
メソッドを使用してトランザクションを開始します。このメソッドは値を返
しません。
Tobj::TransactionCurrent::commit
メソッドを使用すると、現在のトラ
ンザクションがコミットされます。このメソッドは、トランザクションを終
了して、オペレーションの処理を開始します。トランザクションは、トラン
ザクションのすべてのパーティシパントがコミットに同意した場合にのみコ
ミットされます。
トランザクションとクライアント・アプリケーションの関連付けは、アプリケーションが Tobj::TransactionCurrent::commit
メソッドまたは Tobj::TransactionCurrent::rollback
メソッドを呼び出したときに解除されます。次の C++、Java、Visual Basic 例は、クラスに登録している生徒のオペレーションをカプセル化するためにトランザクションを使用する場合を示しています。
C++ の例
//トランザクションを開始
transaction_current_oref->begin();
try {
//トランザクション内でオペレーションを実行
pointer_Registar_ref->register_for_courses(student_id, course_number_list);
...
//オペレーションがエラーなしで実行された場合は、トランザクションをコミット
CORBA::Boolean report_heuristics = CORBA_TRUE;
transaction_current_ref->commit(report_heuristics);
}
catch (CORBA::Exception &) {
//オペレーションで実行エラーが発生した場合は、トランザクションをロールバック
//次に元の例外を再びスローする
//ロールバックが失敗した場合、例外を無視し、
//元の例外を再びスローする
try {
transaction_current_ref->rollback();
}
catch (CORBA::Exception &) {
TP::userlog("rollback failed");
throw;
}
Java の例
try{
gTransCur.begin();
//トランザクション内でオペレーションを実行
not_registered =
gRegistrarObjRef.register_for_courses(student_id,selected_course_numbers);
if (not_registered != null)
//オペレーションがエラーなしで実行された場合は、トランザクションをコミット
boolean report_heuristics = true;
gTransCur.commit(report_heuristics);
} else gTransCur.rollback();
} catch(org.omg.CosTransactions.NoTransaction nte) {
System.err.println("NoTransaction: " + nte);
System.exit(1);
} catch(org.omg.CosTransactions.SubtransactionsUnavailable e) {
System.err.println("Subtransactions Unavailable: " + e);
System.exit(1);
} catch(org.omg.CosTransactions.HeuristicHazard e) {
System.err.println("HeuristicHazard: " + e);
System.exit(1);
} catch(org.omg.CosTransactions.HeuristicMixed e) {
System.err.println("HeuristicMixed: " + e);
System.exit(1);
}
Visual Basic の例
' トランザクションを開始
'
objTransactionCurrent.begin
'
' コースの登録を試行
'
NotRegisteredList = objRegistrar.register_for_courses(mStudentID,CourseList, exception)
'
If exception.EX_majorCode = NO_EXCEPTION then' 要求が成功したら、トランザクションをコミット
'
Dim report_heuristics As Boolean
report_heuristics = True
objTransactionCurrent.commit report_heuristics
Else' 要求が失敗したら、トランザクションをロールバック
'
objTransactionCurrent.rollback
MsgBox "Transaction Rolled Back"
End If
|
Copyright © 2001, BEA Systems, Inc. All rights reserved.
|