如何通过MBean获取数据

时间:2012-03-05 20:57:58

标签: java jmx

我正在将一个servlet实现为一个JMX管理器,它运行在所有受监控的servlet运行的Tomcat的同一个实例中。当我打开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中实际提取数据。答案必须是明显的,因为似乎没有其他人问过,但我确实有一个礼物可以忽略那些显而易见的东西。非常感谢您的帮助。

比尔

1 个答案:

答案 0 :(得分:5)

您需要做的就是如下所示:

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

或创建一个代理对象,该对象获取MBean接口的实例,并允许您以这种方式访问​​它。有关如何执行此操作的教程,请访问:http://docs.oracle.com/javase/tutorial/jmx/remote/custom.html

一个注意事项,这是假设一个远程连接,但从您的问题来看,您似乎在本地访问bean?如果是这种情况,那么您可以使用platform.getMBeanServer()更直接地访问MBeanServer。例如。 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();