Java监控:JMX与Servlets

时间:2012-05-18 20:50:49

标签: java servlets monitoring jmx

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

为什么要使用JMX而不是简单的HTTP servlet?

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

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

3 个答案:

答案 0 :(得分:8)

  

为什么要使用JMX而不是简单的HTTP servlet?

从我的观点来看,JMX更好有三个原因:

  1. 启用监控点所需的代码较少。
  2. 它处理端到端的Java序列化对象,因此有更好的数据一致性。
  3. 它适用于非基于servlet的程序(正如您所提到的)。
  4. JMX为特定数据项提供了更简单的界面。您当然可以在许多servlet中编写相同的功能,但我更容易使用JMX公开它们。

    例如,如果您使用的是Spring,则可以使用org.springframework.jmx.export注释(@ManagedResource@ManagedAttribute等)来标记您的课程。我还发布了我的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发布它的代码如下所示。尽管有豆类,春天也是类似的:

    // 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客户端,尽管存在更好的JMX客户端。
    • 显然,JVM默认发布了许多其他有价值的数据:VM设置,线程详细信息,内存信息等。

答案 1 :(得分:2)

除了读取值之外,JMX还可用于调用Management Beans上的方法。

例如,我们经常使用它来远程强制为Tomcat实例强制进行JVM垃圾收集。

另外,因为JMX是http / https的不同端口,您可以通过防火墙限制网络级别的访问。 JMX也有内置的用户名/密码验证。

Web servlet必须实现自己的访问控制。

答案 2 :(得分:2)

在我看来,JMX被高估了,配置起来可能很棘手。 如果你的应用程序已经是一个webcontainer,我认为你应该选择一个简单的servlet。

一个小servlet approach like nudge4j会给你一切甚至更多。