小编典典

以编程方式访问Tomcat中的内置MBean

tomcat

基本上,我试图在此处修改本教程中的代码: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上的名称……

我觉得我缺少一些基本的东西。但是,关于此的信息似乎非常有限,谷歌并没有太大帮助。


阅读 933

收藏
2020-06-16

共1个答案

小编典典

我认为您的第二段代码中有一个错字。您为Catalina ThreadPool创建了一个名为 mbeanName2 的新ObjectName
,但是当您尝试检索属性“ name”时,您仍在使用 mbeanName

因此应该是:

ObjectName mbeanName2 = new ObjectName("Catalina:type=ThreadPool,name=\"http-apr-8080\"");
Object value = mbsc.getAttribute(mbeanName2, "name");

除此之外,您的代码应该可以正常工作。

2020-06-16