在过去的几年里,我学到了很多关于JMX的知识,并为我的Web应用程序构建了一些非常漂亮的MBean。但是,我不确定我对一个非常基本的问题有一个很好的答案:
为什么要使用JMX而不是简单的HTTP servlet?
我当前的Web应用程序提供冗余监视选项:我可以使用JConsole等客户端访问需要通过JMX监视的数据,或者我可以通过servlet访问XML格式的相同数据。我没有看到使用一种方法而不是另一种方法的强烈理由,但servlet方法确实具有可通过简单的http客户端/ Web浏览器读取的主要优点。
我可以看到JMX对于非Web应用程序的Java应用程序非常有用,但我认为将JMX用于Web应用程序没有任何优势。
答案 0 :(得分:8)
为什么要使用JMX而不是简单的HTTP servlet?
从我的观点来看,JMX更好有三个原因:
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中提供了类似的功能,我不知道。
更多说明:
答案 1 :(得分:2)
除了读取值之外,JMX还可用于调用Management Beans上的方法。
例如,我们经常使用它来远程强制为Tomcat实例强制进行JVM垃圾收集。
另外,因为JMX是http / https的不同端口,您可以通过防火墙限制网络级别的访问。 JMX也有内置的用户名/密码验证。
Web servlet必须实现自己的访问控制。
答案 2 :(得分:2)
在我看来,JMX被高估了,配置起来可能很棘手。 如果你的应用程序已经是一个webcontainer,我认为你应该选择一个简单的servlet。
一个小servlet approach like nudge4j会给你一切甚至更多。