Java 监控:JMX vs. Servlets

5
我在过去的几年中学习了很多关于JMX的知识,并为我的Web应用构建了一些相当不错的MBeans。然而,我并不确定对于一个非常基本的问题是否有一个好的答案:
为什么要使用JMX而不是简单的HTTP servlets?
我的当前Web应用提供了冗余的监视选项:我可以通过像JConsole这样的客户端访问需要监视的数据,也可以通过servlet以XML格式访问相同的数据。我没有看到使用其中一种方法的强烈理由,但是servlet方法具有被简单的http客户端/ Web浏览器读取的重要优势。
我可以看到JMX对于Java应用程序非常有用,尤其是那些不是Web应用程序的应用程序。但是,我无法看出为Web应用程序使用JMX的任何优势。
3个回答

10

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

从我的角度来看,JMX 有以下三个优点:

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

JMX 提供了一个更容易访问特定数据项的接口。您当然可以在多个 Servlet 中编写相同的功能,但使用 JMX 更容易公开这些功能。

例如,如果您正在使用 Spring,则可以使用 org.springframework.jmx.export 注释(@ManagedResource@ManagedAttribute 等)标记您的类。我也发布了 SimpleJmx 框架,因此您可以仅使用几个注释独立于 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() {
       ...
    }
}

我有一个完全工作的示例程序,以便查看其运行方式。因此,您只需向类及其每个属性和/或方法添加注释即可公开值或操作。使用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已经发布了许多其他有价值的数据:VM设置、线程详细信息、内存信息等等。

3

除了读取值外,JMX还可以用于在管理Bean上调用方法。

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

此外,由于JMX是与http/https不同的端口,因此您可以通过防火墙在网络层面限制访问。 JMX也具有内置的用户名/密码身份验证。

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


2
我认为JMX被高估了,配置可能会有些棘手。如果您的应用程序已经是Web容器,那么我认为您肯定应该选择简单的servlet。
像nudge4j这样的微小servlet方法可以为您提供一切甚至更多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接