为什么在简单的 HTTP servlet 上使用 JMX?
从我的角度来看,JMX 更好有 3 个原因:
- 它需要更少的代码来启用监控点。
- 它端到端地处理 Java 序列化对象,因此具有更好的数据一致性。
- 它适用于不基于 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 设置、线程详细信息、内存信息等。