在过去的几年里,我学到了很多关于 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 个:
- 它需要更少的代码来启用监控点。
- 它处理端到端的 Java 序列化对象,因此具有更好的数据一致性。
- 它适用于非基于 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/