Java监控: JMX vs. Servlets

标签 java servlets monitoring jmx

在过去的几年里,我学到了很多关于 JMX 的知识,并为我的 Web 应用程序构建了一些非常漂亮的 MBean。但是,我不确定我对一个非常基本的问题有一个好的答案:

为什么在简单的 HTTP servlet 上使用 JMX?

我当前的 Web 应用程序提供冗余监控选项:我可以使用 JConsole 等客户端通过 JMX 访问需要监控的数据,或者我可以通过 servlet 访问 XML 格式的相同数据。我看不出有充分的理由使用一种方法而不是另一种方法,但 servlet 方法确实具有可被简单的 http 客户端/网络浏览器读取的主要优势。

我可以看到 JMX 对于非 Web 应用程序的 Java 应用程序非常有用,但我看不出将 JMX 用于 Web 应用程序有任何优势。

最佳答案

Why use JMX over simple HTTP servlets?

从我的角度来看,JMX 更好的原因有 3 个:

  1. 它需要更少的代码来启用监控点。
  2. 它处理端到端的 Java 序列化对象,因此具有更好的数据一致性。
  3. 它适用于非基于 servlet 的程序(如您所述)。

JMX 为特定数据项提供了一个更简单的接口(interface)。您当然可以在多个 servlet 中编写相同的功能,但使用 JMX 公开这些功能对我来说更容易。

例如,如果您使用的是 Spring,则可以使用 org.springframework.jmx.export 注释(@ManagedResource@ManagedAttribute 等)来标记您的类(class)。我还发布了我的 SimpleJmx framework所以你可以很容易地通过一些独立于 Spring 的注释来暴露属性和操作。例如:

@JmxResource(domainName = "j256", objectName = "lookupCache")
public class LookupCache {

    // this can also be done as @JmxAttributeMethod on the getter/setters
    @JmxAttributeField(description = "Number of hits in the cache")
    private int hitCount;
    ...

    @JmxOperation(description = "Flush the cache")
    public void flushCache() {
       ...
    }
}

我有一个 fully working example program看看它是如何工作的。因此,要公开值或操作,您需要做的就是向类以及每个属性和/或方法添加注释。使用 SimpleJmx 发布它的代码如下所示。 Spring 与 bean 类似:

// create a new server listening on port 8000
JmxServer jmxServer = new JmxServer(8000);
jmxServer.start();
// register our lookupCache object defined above
jmxServer.register(lookupCache);

要在 servlet 中获得类似的功能,将需要比注释更多的代码。也就是说,在我不知道的 servlet 领域可能存在提供类似功能的框架。

一些注意事项:

  • 可能有更好的监视 HTTP/HTML 的工具,但也有大量的分布式 JMX 监视应用程序。可能是折腾。
  • 能够以编程方式从 JMX 服务器获取 对象 与仅从 servlet 页面获取字符串相比是一个优势。 SimpleJmx还支持一个简单的 JMX 客户端,尽管存在更好的客户端。
  • 显然 JVM 已经默认发布了许多其他有值(value)的数据:VM 设置、线程详细信息、内存信息等。

关于Java监控: JMX vs. Servlets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10659572/

相关文章:

c++ - 类似于内核版本 2.6.9(或更低版本)的 inotify 的类似工具

Java不可修改的数组

java - log.d 没有出现在 Logcat 中

java - 如何在 eclipse 和 tomcat 中创建简单的(servlet)java ee 项目

java - JNDI @Resource 注释

java - org.apache.jasper.JasperException : The attribute prefix [fn] does not correspond to any imported tag library

java - Tomcat 6 Web 应用程序随时间消耗内存

java - 尝试/捕捉无限循环?

java - 如何远程调试运行在tomcat服务上的webapplication?

java - Java EE/Seam 应用程序中的 session 大小