Java 如何通过MBean获取数据

Java 如何通过MBean获取数据,java,jmx,Java,Jmx,我正在实现一个servlet作为一个JMX管理器,它运行在所有受监控servlet运行的Tomcat实例中。当我打开JConsole时,我可以看到被监视servlet的数据。在我的manager servlet中,我可以枚举所有可用的标准MBean,包括我在受监视的servlet中创建的MBean,代码如下: JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi://localhost:1099/jndi/rmi://loc

我正在实现一个servlet作为一个JMX管理器,它运行在所有受监控servlet运行的Tomcat实例中。当我打开JConsole时,我可以看到被监视servlet的数据。在我的manager 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??
         }
     }
}
JMXServiceURL=newjmxserviceurl(“服务:jmx:rmi://localhost:1099/jndi/rmi://localhost:1099/jmxrmi" );
mConnector=JMXConnectorFactory.connect(url);
mMBSC=mConnector.getMBeanServerConnection();
mObjectName=newobjectname(“com.blahCompany.blah.blah:type=BlahBlah”);
//只是在寻找一种特殊的豆子
设置myMbean=mMBSC.queryNames(mObjectName,null);
if(myMBean.size()==1)//我知道它存在
{
MBeanInfo MBeanInfo=mMBSC.getMBeanInfo();
MBeanAttributeInfo[]MBeanAttributeInfo=mbeanInfo.getAttributes();
用于(MBeantTributeInfo属性信息:MBeantTributeInfo)
{
if(attribInfo.isReadable())
{
字符串attribName=attribInfo.getName();
字符串attribReturnType=attribInfo.getType();
//数据在某处…在哪里????
//在MBeanInfo?
//在论坛资讯里??
}
}
}
问题是我不知道如何从这些MBean中提取数据。答案肯定是非常明显的,因为似乎没有人问过,但我有一种忽视显而易见的天赋。我们将非常感激你的帮助


比尔

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

Object value = mMBSC.getAttribute(objectName, attributeName);
或者创建一个代理对象,该对象获取MBean接口的实例,并允许您以这种方式访问它。有关如何执行此操作的教程,请参见:


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

显然是这样。错误在于没有仔细阅读API文档。谢谢你的帮助。我正在本地访问bean。。。manager和bean都在同一个JVM中。我将尝试MBeanServer方法,因为它看起来更直接。再次感谢。我用一条关于本地访问mbean服务器的注释更新了我的答案,根据我从您的问题中了解到的,这是您的情况所需要的(无需通过URL连接)。我想性能会比使用远程连接更好。