5

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

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

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

我可以看到 JMX 对于不是 Web 应用程序的 Java 应用程序非常有用,但我看不出将 JMX 用于 Web 应用程序有什么好处。

4

3 回答 3

10

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

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

  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 设置、线程详细信息、内存信息等。
于 2012-05-18T20:59:52.820 回答
3

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

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

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

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

于 2012-05-18T20:59:35.540 回答
2

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

像 nudge4j这样的小型servlet 方法可以为您提供一切,甚至更多。

于 2016-06-06T12:30:31.950 回答