![]() |
![]() |
|
|
| |
アプリケーション エラーの管理
次の節では、アプリケーションでエラー条件を管理し解釈するメカニズムについて説明します。
アプリケーション エラーのテスト
注意: エラー条件のテスト方法を示すサンプルを表示するには、 トランザクション コードの例を参照してください。
アプリケーション ロジックは、戻り値を持つ呼び出しの後にエラー条件をテストし、それらの条件に基づいて適切な手順を実行する必要があります。関数が値を返すイベントでは、特定の値をテストする関数を呼び出し、各条件に適切なアプリケーション ロジックを実行できます。
例外クラス
WebLogic Tuxedo コネクタでは、次の例外クラスが送出されます。
Ferror
: FML 操作中に発生したエラーで送出される例外。
TPException
: TPException 障害を表す例外。
TPReplyException
: ユーザ データが送出される例外と関連付けられている場合に TPException 障害を表す例外。
致命的なトランザクション エラー
トランザクションの管理では、どのエラーがトランザクションにとって致命的であるかを理解することが重要です。致命的なエラーが発生した場合、トランザクションのイニシエータによって commit()
を呼び出し、そのトランザクションをアプリケーション レベルで明示的にアボートする必要があります。トランザクションは、次のような理由によりエラーとなります。
commit()
が、トランザクションのオリジネータではなく、参加コンポーネントによって呼び出された。
WebLogic Tuxedo コネクタのタイムアウト条件
WebLogic Tuxedo コネクタを使用するときに発生するタイムアウトには、次の 2 つのタイプがあります。
ブロッキング タイムアウトとトランザクション タイムアウト
ブロッキング タイムアウトは、呼び出しがブロッキング条件を消去するために待機できる時間を超えると発生します。トランザクション タイムアウトは、トランザクションが setTransactionTimeout()
内で定義された時間以上かかっている場合に発生します。デフォルトでは、プロセスがトランザクション モードでない場合、ブロッキング タイムアウトが実行されます。通信呼び出しの flags パラメータが TPNOTIME
に設定されている場合は、ブロッキング タイムアウトのみが適用されます。プロセスがトランザクション モードである場合、ブロッキング タイムアウトおよび TPNOTIME
フラグは適切ではありません。トランザクションが開始されたときにタイムアウトが定義されていた場合、プロセスはトランザクション タイムアウトのみに対応します。2 つの異なるタイプのタイムアウトの関係は、次のようになります。
TPNOTRAN
フラグなしで実行)は停滞状態となり、参照されなくなることがあります。今後許可される通信は、応答、ブロッキング、およびトランザクションのない前述のケースのみです。
commit() の影響
タイムアウトが commit()
への呼び出しの後に発生した場合のトランザクションの状態は不明確です。トランザクションがタイムアウトし、そのトランザクションがアボートしたことをシステムが認識した場合、setRollbackOnly()
はエラーを返します。
トランザクションの状態が明確ではない場合、トランザクションがコミットされたかアボートされたかを調べるために、リソースをクエリしてそのトランザクションの一部だった変更作業が適用されているかどうかを判断する必要があります。
TPNOTRAN の影響
注意: トランザクションは、そのトランザクションの一部ではないサービスからの応答を待機中にタイムアウトすることがあります。
プロセスがトランザクション内にあり、TPNOTRAN
に設定された flags を使用して通信呼び出しを行う場合、呼び出されたサービスはそのトランザクションの参加コンポーネントになることはできません。サービスの成功または失敗は、そのトランザクションの結果に影響を与えません。
アプリケーション イベントのトラッキングのガイドライン
System.out.println()
を使用してアプリケーションの実行を追跡し、WebLogic Server トレース ログにメッセージを書き込むことができます。String 型の変数を取得する log()
メソッドを作成し、呼び出しへの引数として変数名を使用するか、呼び出しへの引数としてリテラルを引用符で囲んだメッセージを使用します。次の例は、tpcall()
の進行状況を追跡するために使用する一連のメッセージです。
コード リスト 7-1 イベント ロギングの例
.
.
.
log("About to call tpcall");
try {
myRtn = myTux.tpcall("TOUPPER", myData, 0);}
catch (TPReplyException tre) {
log("tpcall threw TPReplyExcption " + tre);
throw tre;
}
catch (TPException te) {
log("tpcall threw TPException " + te);
throw te;
}
catch (Exception ee) {
log("tpcall threw exception: " + ee);
throw new TPException(TPException.TPESYSTEM, "Exception: " + ee);
}
log("tpcall successfull!");
.
.
.
private static void
log(String s)
{ System.out.println(s
);}
.
.
.
![]() |
![]() |