リモートメソッド呼び出しが失敗する場合の対処

クライアントからEJB のリモートメソッドの呼び出しが失敗する場合の対処について説明します。

RMI の例外のラッピング

RMI の仕様では、リモート呼び出しが失敗した場合、クライアントにはjava.rmi.RemoteException が投げられます。このとき、エラーの原因となった例外がRemoteException の中にラッピングされていますので、この例外を参照することによりエラーの原因を特定することができます。

また、サーバ側のEJB コンテナ上でリモートメソッドを実行しているときに例外が発生した場合は、java.rmi.RemoteException がさらにjava.rmi.ServerException にラッピングされて投げられます。

リモート呼び出しタイムアウトが発生した場合

クライアント側でリモート呼び出しのタイムアウトを検知した場合、以下のようにorg.omg.CORBA.NO_RESPONSE をラッピングしたRemoteException がクライアントに投げられます。

java.rmi.RemoteException: CORBA NO_RESPONSE 5130 No; nested exception is: org.omg.CORBA.NO_RESPONSE: Invocation timeout occurred

クライアント側のタイムアウト値の設定はObject Broker の設定に従います。既定値は30 秒となっています。必要に応じて設定を変更してください。

注意としてタイムアウトが発生した場合でもEJB コンテナ側ではそのまま処理が継続されますので、クライアント側では呼び出しがエラーとなったように見えても、サーバ側ではトランザクションがコミットされてしまう可能性があります。このような問題を発生させないようにするためには、サーバ側でもメソッドの実行時間の上限の値をクライアント側のタイムアウト値の設定よりも短く設定する必要があります。

引数、戻り値のマーシャルエラーが発生した場合

org.omg.CORBA.MARSHAL がラッピングされたRemoteException が投げられた場合、RMI-IIOP のマーシャリング、アンマーシャリングがエラーの原因です。以下のケースが考えられますのでそれらを確認してください。


関連情報