Oracle® Fusion Middleware Oracle WebLogic Server Tuxedo Connector プログラマーズ ガイド 11g リリース 1 (10.3.1) B55532-01 |
|
戻る |
以下の節では、アプリケーションでエラー条件を管理し解釈するメカニズムについて説明します。
アプリケーション ロジックは、戻り値を持つ呼び出しの後にエラー条件をテストし、それらの条件に基づいて適切な手順を実行する必要があります。関数が値を返すイベントでは、特定の値をテストする関数を呼び出し、各条件に適切なアプリケーション ロジックを実行できます。
Oracle WebLogic Tuxedo Connector では、次の例外クラスが送出されます。
Ferror : FML 操作中に発生したエラーで送出される例外。
TPException : TPException 障害を表す例外。
TPReplyException : ユーザ データが、送出される例外と関連付けられている場合に TPException 障害を表す例外。
トランザクションの管理では、どのエラーがトランザクションにとって致命的であるかを理解することが重要です。致命的なエラーが発生した場合、トランザクションの開始プロセスによって commit()
を呼び出し、そのトランザクションをアプリケーション レベルで明示的にアボートする必要があります。トランザクションは、次のような理由によりエラーとなります。
トランザクションの開始プロセスまたは参加コンポーネントが、トランザクションをロールバックとしてマーク付けした。
トランザクションがタイムアウトした。
commit()
が、トランザクションの開始側ではなく、参加コンポーネントによって呼び出された。
Oracle WebLogic Tuxedo Connector を使用するときに発生するタイムアウトには、次の 2 つのタイプがあります。
ブロッキング タイムアウト
トランザクション タイムアウト
ブロッキング タイムアウトは、呼び出しがブロッキング条件を消去するために待機できる時間を超えると発生します。トランザクション タイムアウトは、トランザクションが setTransactionTimeout()
内で定義された時間以上かかっている場合に発生します。デフォルトでは、プロセスがトランザクション モードでない場合、ブロッキング タイムアウトが実行されます。通信呼び出しの flags
パラメータが TPNOTIME
に設定されている場合は、ブロッキング タイムアウトのみが適用されます。プロセスがトランザクション モードである場合、ブロッキング タイムアウトおよび TPNOTIME
フラグは適切ではありません。トランザクションが開始されたときにタイムアウトが定義されていた場合、プロセスはトランザクション タイムアウトのみに対応します。2 つの異なるタイプのタイムアウトの関係は、次のようになります。
プロセスがトランザクション モードでなく、ブロッキング タイムアウトが非同期呼び出しで発生した場合、ブロックした通信呼び出しは失敗するが、呼び出し記述子はそのまま有効となり、再発行された呼び出しで使用可能である。今後の一般の通信に影響はありません。
トランザクション タイムアウトの場合、非同期トランザクション応答への呼び出し記述子 (TPNOTRAN
フラグなしで実行) は停滞状態となり、参照されなくなることがある。今後許可される通信は、応答、ブロッキング、およびトランザクションのない前述のケースのみです。
タイムアウトが commit()
の呼び出し後に発生した場合のトランザクションの状態は不定です。トランザクションがタイムアウトし、そのトランザクションがアボートしたことをシステムが認識した場合、setRollbackOnly()
または rollback()
はエラーを返します。
トランザクションの状態が明確ではない場合、トランザクションがコミットされたかアボートされたかを調べるために、リソースをクエリしてそのトランザクションの一部だった変更作業が適用されているかどうかを判断する必要があります。
System.out.println()
を使用してアプリケーションの実行を追跡し、Oracle WebLogic Server トレース ログにメッセージを書き込むことができます。String
型の変数を取得する log()
メソッドを作成し、呼び出しへの引数として変数名を使用するか、呼び出しへの引数としてリテラルを引用符で囲んだメッセージを使用します。次の例は、tpcall()
の進行状況を追跡するために使用する一連のメッセージです。
コード リスト 10-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);} . . .