要求のタイムアウト ORB サービス設定により、 アウトバウンド RMI/IIOP エンタープライズ Bean 呼び出しの応答をクライアントが待つ時間を決定します。 この設定は、各 IIOP の位置指定に適用されるサーバー全体に及ぶ設定であり、エンタープライズ Bean 呼び出しの結果として送信される要求メッセージです。 指定された制限時間が経過すると、アウトバウンド RMI/IIOP エンタープライズ Bean を呼び出したアプリケーションは、org.omg.CORBA.COMM_FAILURE のシステム例外を受信します。
BBOO0325W An IIOP request for Class Name 'com.ejb.test.hello.second.EJSRemoteStatelessSayHelloSecond_686a0ff2' and Method Name 'sayHelloTwo', to 'jobname=BBOS002 asid=0031', has timed out. SessionHandle=0000000026D9F0480000000A008004FF, Request ID=00000004
このメッセージは、ターゲットのエンタープライズ Bean のクラスおよびメソッドを示しています。 ターゲットのエンタープライズ Bean が TCP/IP で呼び出された場合、 このメッセージの「to」セクションにはターゲット・サーバーのホスト名とポートが含まれます。 ターゲットのエンタープライズ Bean が最適化されたローカル通信を介して呼び出された場合、 このメッセージの「to」セクションには、前述の例のようにターゲットのジョブ名と ASID が含まれています。
/bbooejsb.cpp+3395 ... BBOO0011W The function ORBEJSBridge::invoke_request(JNIEnv *, bboojorb *, char *, CORBA::Boolean, CORBA::Request *&, void *)+3395 received CORBA system exception CORBA::COMM_FAILURE. Error code is C9C26A48
このトレース・エントリーのマイナー・コード C9C26A48 は、 RMI/IIOP アウトバウンド・タイマーの待機時間が終了したことを示します。
BBOO0328I: インバウンド GIOP 応答に対する要求は見つかりませんでした。 SessionHandle=<hstring>, RequestID=<hstring>。
要求 または応答はセッション・ハンドルや要求 ID によって一意的に識別され、 この要求に対して以前に BBOO0325W メッセージが受信されたかどうかの判断に 使用されます。
呼び出されたエンタープライズ Bean からの応答をクライアントが待つ時間長を変更するには、以下の手順を実行します。
org.omg.CORBA.COMM_FAILURE 例外はシステム例外であるので、 エンタープライズ Bean を呼び出すアプリケーションは、期限が切れたエンタープライズ Bean 呼び出しの補正も、再試行も不要です。 しかし、アトミック・トランザクションがアプリケーションによって使用されていない場合などの状態では、アプリケーションに、期限が切れたエンタープライズ Bean 呼び出しの補正または再試行をさせることがきます。
// This method runs outside a global transaction. public Data callingMethod() throws … { try{ InitialContext con = new InitialContext(); EJBHome home con.lookup(...); CalledBean cb = home.create(); } catch (org.omg.CORBA.COMM_FAILURE cf1){ // The home create could timeout, so put retry or // compensation logic here. } catch( CreateException cx){ throw new ... } catch( NamingException nx){ throw new ... } catch(RemoteException ex){ throw new ... } try{ cb.calledMethod(…); } catch (org.omg.CORBA.COMM_FAILURE cf2){ // The calledMethod could timeout, so put retry or // compensation logic here. } catch( … ){ … } } // This method can run in a global transaction. private void calledMethod(String strKey) throws … { try{ // business logic here } catch ( … ){ throw new ... } }
アトミック・トランザクションの有効範囲内で実行されるアプリケーションは、 そのアプリケーションに、期限が切れたエンタープライズ Bean 呼び出しの補正または再試行をさせる場合、 エンタープライズ Bean を呼び出す前にそのトランザクションを中断します。 この呼び出しは、TX_NOTSUPPORTED エンタープライズ Bean メソッドに組み込むのが、現行のトランザクションを中断する最良の方法です。