我们的应用程序通过 JMX 公开了一些方法,我们使用 JVisualVM 调用这些方法。
这通常工作得很好,但有时方法调用会在应用程序内部出现异常而中止。在这种情况下,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 在没有特殊配置的情况下工作。此外,它可能运行一个应用程序代码甚至不可用的系统。