spring - 由于自定义异常类,避免通过 JVisualVM 进行 JMX 调用时出现 ClassNotFoundException

标签 spring exception jmx jvisualvm

我们的应用程序通过 JMX 公开一些方法,我们使用 JVisualVM 调用这些方法。

这通常工作得很好,但有时方法调用会因应用程序内部的异常而中止。在这种情况下,JVisualVM 不会显示异常中的错误消息,而是显示错误消息

java.rmi.UnmarshalException [...] error unmarshaling return; 
nested exception is: java.lang.ClassNotFoundException [...]

这毫无帮助且令人困惑;我们希望 JVisualVM 显示真正的错误消息。

到目前为止我们发现了什么:

JMX 似乎会序列化和反序列化调用期间抛出的任何异常。然而,在我们的例子中,异常是自定义异常,它们不属于 JDK 的一部分。因此,当通过 JVisualVM 调用方法时,JVisualVM 无​​法显示异常,因为未知的自定义异常类导致反序列化失败。

现在,作为一种解决方法,我们将通过 JMX 公开的所有方法包装在 try-catch block 中,该 block 仅执行

    throw new RuntimeException("Error invoking method:"+e);

这是可行的,因为它将任何异常转换为字符串,但看起来相当不优雅且冗长。

  • 是否有一些通用方法可以告诉 JMX 不要序列化异常?像“总是将异常转换为字符串”之类的东西?
  • 我们使用 Spring 的 MBeanExporter 。 Spring 中是否有一种机制可以处理这个问题?

编辑

我们知道我们可以配置 JVisualVM 来加载有问题的类。然而,我们希望 JVisualVM 无​​需特殊配置即可工作。此外,它可能运行一个应用程序代码甚至不可用的系统。

最佳答案

您可以尝试在 JVisualVM 上使用 -Djava.rmi.server.codebase 以便它可以从远程 JVM 加载异常类吗?

编辑:如果您不想这样做,您可以使用方面来执行与 try-catch block 等效的操作。那么你只需要在一处使用它。如果您已经在使用 Spring,Spring AOP 将使这一切变得非常容易。

关于spring - 由于自定义异常类,避免通过 JVisualVM 进行 JMX 调用时出现 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10243528/

相关文章:

java - @EnableHypermediaSupport 的 XML 配置等效项

c++ - Linux 是否记录守护进程抛出的未捕获异常?

java - JMX 更新 TabularData 值

Java 飞行记录器 : Does it need JMX readwrite access or is readonly enough?

java - 使用最新的 Sun JVM(1.6),是否有可能获得 GC 线程信息?

java - 在固定时间执行调度程序

spring - 具有相同类型的多个关系类

java - Spring MVC 应用程序的这些 mvc :resources mapping tags declared into the servlet-context. xml 意味着什么?

java - 在java中创建检查异常类

.net - 将异常和其他错误记录到.Net Core API中的txt文件的最佳方法