基本上,我试图在此处修改本教程中的代码:http : //docs.oracle.com/javase/tutorial/jmx/remote/custom.html, 以便可以从此处描述的tomcat访问MBean:http ://wiki.apache.org/tomcat/FAQ/监控
从代码访问JMX Bean java.lang:type = Memory没问题,因为它的接口是在java.lang中定义的。这是该代码的示例:
ObjectName mbeanName = new ObjectName("java.lang:type=Memory"); MemoryMXBean mxbeanProxy2 = JMX.newMXBeanProxy(mbsc, mbeanName, MemoryMXBean.class, true); MemoryUsage memUsage = mxbeanProxy2.getHeapMemoryUsage(); echo("\nMemory Utilization: " + (memUsage.getUsed()/(double)memUsage.getMax()) * 100 + "%");
此处的mbsc是MBeanServerConnection的实例。问题是,当我尝试以类似的方式访问tomcat中的内置MBean时,遇到了找不到为任何tomcat MBean定义的任何接口的问题。我可以从JConsole监视MBean,但是为此,我需要能够从代码执行此操作。我在某个地方发现它也可以通过以下方式完成:
ObjectName mbeanName2 = new ObjectName("Catalina:type=ThreadPool,name=\"http-apr-8080\""); Object value = mbsc.getAttribute(mbeanName, "name");
但这给了我这个异常:线程“ main”中的异常javax.management.AttributeNotFoundException:没有这样的属性:com.sun.jmx.mbeanserver上的名称……
我觉得我缺少一些基本的东西。但是,关于此的信息似乎非常有限,谷歌并没有太大帮助。
我认为您的第二段代码中有一个错字。您为Catalina ThreadPool创建了一个名为 mbeanName2 的新ObjectName ,但是当您尝试检索属性“ name”时,您仍在使用 mbeanName 。
因此应该是:
ObjectName mbeanName2 = new ObjectName("Catalina:type=ThreadPool,name=\"http-apr-8080\""); Object value = mbsc.getAttribute(mbeanName2, "name");
除此之外,您的代码应该可以正常工作。