私たちのアプリケーションは、JVisualVM を使用して呼び出す JMX を介していくつかのメソッドを公開します。
これは正常に機能しますが、アプリケーション内で例外が発生してメソッド呼び出しが中止されることがあります。その場合、例外からのエラー メッセージを表示する代わりに、JVisualVM はエラー メッセージを表示します。
java.rmi.UnmarshalException [...] error unmarshaling return;
nested exception is: java.lang.ClassNotFoundException [...]
これは役に立たず、混乱を招きます。JVisualVM に実際のエラー メッセージを表示してもらいたいのです。
これまでにわかったこと:
JMX は、呼び出し中にスローされた例外をシリアライズおよびデシリアライズするようです。ただし、この場合、例外は JDK の一部ではないカスタム例外です。したがって、JVisualVM を介してメソッドを呼び出すと、未知のカスタム例外クラスが原因で逆シリアル化が失敗するため、JVisualVM は例外を表示できません。
現在、回避策として、JMX を介して公開されているすべてのメソッドをtry-catch
ブロックでラップしています。
throw new RuntimeException("Error invoking method:"+e);
これは例外を文字列に変換するため機能しますが、かなり洗練されておらず冗長に見えます。
- 例外をシリアル化しないように JMX に指示する一般的な方法はありますか? 「常に例外を文字列に変換する」のようなものですか?
- Spring のMBeanExporterを使用します。これを処理するSpringのメカニズムはありますか?
編集
問題のクラスをロードするように JVisualVM を構成できることがわかっています。ただし、特別な構成なしで JVisualVM を動作させたいと考えています。また、アプリケーション コードが利用できないシステムを実行する場合もあります。