Как получить данные через MBean - PullRequest
4 голосов
/ 06 марта 2012

Я реализую сервлет в качестве менеджера JMX, который работает в том же экземпляре Tomcat, в котором работают все отслеживаемые сервлеты. Я вижу данные отслеживаемых сервлетов при открытии JConsole.Из моего сервлета менеджера я могу перечислить все доступные стандартные 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??
         }
     }
}

Проблема в том, что я не знаюкак на самом деле извлечь данных из этих MBeans.Ответ должен быть чертовски очевидным, потому что, кажется, никто не спрашивал, но у меня есть дар пропустить очевидное.Будем благодарны за вашу помощь.

Билл

1 Ответ

5 голосов
/ 06 марта 2012

Все, что вам нужно сделать, это примерно так:

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

Или создать прокси-объект, который получает экземпляр интерфейса MBean и позволяет вам получить к нему доступ таким образом.Учебное пособие о том, как это сделать, находится здесь: http://docs.oracle.com/javase/tutorial/jmx/remote/custom.html

Одно замечание, это предполагает удаленное соединение, но из вашего вопроса кажется, что вы получаете доступ к компонентам локально?Если это так, то вы можете использовать platform.getMBeanServer () для более прямого доступа к MBeanServer.Например MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

...