我正在将一个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中实际提取数据。答案必须是明显的,因为似乎没有其他人问过,但我确实有一个礼物可以忽略那些显而易见的东西。非常感谢您的帮助。
比尔
答案 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();