技術的雑談-CORBA経由で取得されたObjectのSystemException
環境
- ORB:JacORB-2.2.2(JavaでのCORBAの実装)
- JDK1.5.0_04
現象
- JacORBを利用しているアプリケーションが突然落ちる
- チェック例外は全てcatchしているはず
- ログなどが取れるときには「org.omg.CORBA.SystemException(と、その派生クラス)」が発生している
- 発生箇所はJacORBを呼び出した時だったり、CORBA経由で取得したObjectを使ったときだったり
- サーバントとクライアントが別のマシン上にいたり、クライアントが接続されたままのサーバントアプリケーションを落としたときに発生することがある
原因
JacORB(と、いうか、JDKでのCORBAリファレンス実装)において、org.omg.CORBA.SystemExceptionがjava.lang.RuntimeExceptionの派生クラスとして定義されているから。
java.lang.RuntimeExceptionは「非チェック例外」であり、catchしなくてもコンパイルエラーにならない。当然Eclipseでも警告が出たりしない。
それと、CORBA経由で取得されたObjectはプログラミング的にはローカルのオブジェクトと同じように使えているように見えるが、実はメソッドを呼び出すたびにサーバントとの間でネットワーク通信をしている。
その通信が何かの問題で断絶しているときにCORBA Objectのメソッド呼び出しをすると、CORBA Objectからorg.omg.CORBA.SystemExceptionが上がることになる。
対処
- CORBA経由で取得したObjectを使う箇所では(コンパイラが警告してくれなくても)org.omg.CORBA.SystemExceptionをcatchするように心がける。
- 一度取得したCORBA Objectをアプリケーション全体で使いまわすような事はせずに、メソッドの中で局所的に使用する。(バグ要因箇所の集中化)。但し、CORBA Objectの取得にはネットワーク的・パフォーマンス的コストがかかるので要求されるレスポンスとの兼ね合いを考慮する。
- 最悪でも、CORBA ObjectがいきなりRuntimeExceptionを返してデッドロックに陥ったり、無限ループにはまるようなアルゴリズムは避ける。CORBA Objectのメソッドの戻り値をいきなり他のメソッドにほおり込んだりはせず、一旦変数で受け止め、nullチェックをして処理にまわすようにする。
逆に、この辺をしっかり作っておくとネットワークトラブルにも安定したCORBAアプリケーションを作ることができる。
履歴
2005/10/20 -- 初版
技術的雑談へ戻る