2012-03-05 46 views
4

我正在實現一個servlet作爲JMX管理器,該JMX管理器運行在Tomcat的相同實例中,以便運行所有受監控的servlet。當我打開JConsole時,可以看到受監控servlet的數據。從我的經理servlet中我可以枚舉所有可用標準的MBean,包括我在監控的servlet中創建的,使用這樣的代碼:如何通過MBean獲取數據

JMXServiceURL url = new JMXServiceURL(  "service:jmx:rmi://localhost:1099/jndi/rmi://localhost:1099/jmxrmi"); 

mConnector = JMXConnectorFactory.connect(url); 
mMBSC = mConnector.getMBeanServerConnection(); 
mObjectName = new ObjectName("com.blahCompany.blah.blah:type=BlahBlah"); 

// just looking for one specific bean 
Set<ObjectName> myMbean = mMBSC.queryNames(mObjectName, null); 

if(myMBean.size() == 1) // I know it exists 
{ 
    MBeanInfo mbeanInfo = mMBSC.getMBeanInfo(<ObjectName extracted from Set>); 
    MBeanAttributeInfo[] mbeanAttributeInfos = mbeanInfo.getAttributes(); 

    for(MBeanAttributeInfo attribInfo : mbeanAttributeInfos) 
    { 
     if(attribInfo.isReadable()) 
     { 
      String attribName = attribInfo.getName(); 
      String attribReturnType = attribInfo.getType(); 

      // The data's somewhere ... where???? 
      // In the MBeanInfo? 
      // In the MBeanAttributeInfo?? 
     } 
    } 
} 

的問題是我不知道如何實際上從這些MBean中提取數據。答案一定是明顯的,因爲其他人似乎沒有問過,但我確實有一個禮物可以忽略這些明顯的問題。感謝您的幫助。

比爾

+0

我更新了我的回答,提供了關於本地訪問mbean服務器的說明,從我的問題中瞭解到您的情況需要什麼(無需通過URL進行連接)。我認爲性能會比使用遠程連接更好。 – 2012-03-05 21:22:03

回答

5

所有你需要做的是一樣的東西下面:

Object value = mMBSC.getAttribute(objectName, attributeName); 

或者創建一個代理對象,獲取MBean接口的實例,並允許您訪問它的方式。如何做到這一點的教程在這裏:http://docs.oracle.com/javase/tutorial/jmx/remote/custom.html

一個注意,這是假設遠程連接,但從你的問題,似乎你是在本地訪問豆?如果是這種情況,那麼可以使用platform.getMBeanServer()更直接地訪問MBeanServer。例如。 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

+0

明顯的是。錯誤不是仔細閱讀API文檔*。謝謝您的幫助。 – joe7pak 2012-03-05 21:16:12

+0

我正在訪問Beans local ... manager和beans都在同一個JVM中。我會嘗試MBeanServer方法,因爲它看起來更直接。再次感謝。 – joe7pak 2012-03-05 21:24:31