Oracle® Fusion Middleware Oracle WebLogic Server Oracle WebLogic Tuxedo Connectorアプリケーションの開発 12c (12.1.2) E48051-01 |
|
前 |
この章では、Oracle WebLogic Tuxedo Connectorを使用した場合発生するエラー条件をアプリケーションで管理し解釈するメカニズムについて説明します。
この章の内容は以下のとおりです。
アプリケーション・ロジックは、戻り値を持つ呼出しの後にエラー条件をテストし、それらの条件に基づいて適切な手順を実行する必要があります。関数が値を返すイベントでは、特定の値をテストする関数を呼び出し、各条件に適切なアプリケーション・ロジックを実行できます。
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);} . . .