4

私はよくある問題を抱えており、それを行う最善の方法についてあなたの意見を聞きたいと思っています。

分散サーバー システムで実行されるアプリケーションがあるとします。フロントエンドサーバーとバックエンドサーバーとしましょう。RMI を介して呼び出されるバックエンド サーバー上のメソッド。

通常、バックエンドの Java プロセスには、フロントエンドの Java プロセスとは異なるライブラリが必要です。バックエンドで実行時例外が発生する可能性があります。スローされた例外はバックエンドでキャッチされないため、フロントエンド サーバーに移動します。ここでの問題は、パッケージがクラスパスにないため (EJBTransactionRolledBackException など)、フロントエンドが例外を認識しないことです。ClassNotFoundException という別の例外がスローされます。これにより、スタックトレースにバックエンド サーバーからのスタックが含まれないため、実行が発生した場所を確認できなくなります。私が考えることができる別のシナリオは、例外をシリアル化できない場合です。

この問題をどのように解決しますか?try ... catch および rethrow ブロックを作成しなくても、スローされた実行時例外をログに記録できますか?

4

4 に答える 4

5

バックエンド サーバーのメソッドは、RMI を介して呼び出されます。

さて、あなたの問題があります。:-)

真剣に、これに対処する最も簡単な方法は、おそらくサーバーで次のプロパティを設定することです。

-Dsun.rmi.server.exceptionTrace=true

これにより、サーバー側で例外スタック トレースが得られます。クライアント側では修正されませんClassNotFoundExceptionが、少なくとも問題が発生した場合は、サーバー ログを調べて詳細を確認する必要があります。

その他の便利な RMI プロパティについては、次のドキュメントを参照してください。

http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/javarmiproperties.html

http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.html

于 2012-08-22T21:41:53.733 に答える
1
  • 必要に応じて、RMIのコードベース機能を試してサーバー クラスを取得できます。ただし、JBoss での設定は面倒です
  • 動的プロキシに基づいてインターフェイス層をインストールして、例外変換を行うことができます (ほとんどの EJB サーバーでは機能しないと思います)。
  • サーバーがJBossの場合、EJBインターセプターを使用して例外変換を行うことができます

この方向で他のサーバーが提供するものはありません。

于 2012-08-21T15:21:08.900 に答える
0

私はこの問題に少し混乱しています。フロントエンド サーバーとバックエンド サーバーを使用しているため、メッセージと結果のペアを response として定義しないでください。また、メッセージはテキストである必要はありません。独自のコーディング システムで十分です。Spring Exception トランスレータと同様に、統一されたメカニズムを使用してフロントエンド サーバーでコードをテキスト メッセージに変換できます。

于 2014-08-23T11:02:16.060 に答える
0

自分で答えを探しているときに、この質問に出くわしました。良い答えはありませんが、回避策があります。

私は http 経由のシリアル化を使用して単純な rpc プロトコルを作成しましたが、これにも同じ問題があります。ここで、問題に対する私の半分賢い解決策を見つけることができます。

https://github.com/stickfigure/trivet/blob/master/src/main/java/com/voodoodyne/trivet/ExceptionalObjectInputStream.java

基本的に、オブジェクト ストリームをデシリアライズする際に、"Exception" で終わる欠落クラスを探し、クラス記述子をクライアント上の例外クラスと交換します。利点は、ネストされたスタック トレースがそのまま保持されることです。悪いニュースは、これが例外クラスを置き換えるため、その情報が失われることです。それぞれ入れ替え例外となりServerSideExceptionます。また、メッセージ以外の追加データは破棄されます。通常、スタックトレースとメッセージから何が起こっているかを理解するのはそれほど難しくありませんが、このコードは、元の例外の種類を掘り下げる必要がある場合に備えてログに記録します。

ただし、この手法を RMI に適用するには、クライアント プロキシに十分なフックが必要になるとは思えません。

于 2013-07-21T00:44:45.193 に答える