2012-04-26 14 views
5

Supongamos que tenemos un MBean que tiene los siguientes atributos y operaciones.Cómo verificar programáticamente las operaciones y los atributos de MBean JMX?

Atributos: nombre tamaño

Operaciones: getName() getSize()

¿Hay una manera de comprobar mediante programación de los atributos y operaciones? He estado trabajando con IBM WebSphere MBeans y su documentación no es muy buena.

Por ejemplo, si va al IBMs Infocenter y navega hasta Despliegue de red -> Referencia -> Interfaces de programación -> Interfaces Mbean -> ThreadPool. Solo tienen atributos enumerados y no hay operaciones.

Utilizando la herramienta wsadmin de WebSphere, realmente puedo verificar para ver las operaciones y los atributos. Me gustaría saber si hay una forma de hacer esto con todos los MBeans.

wsadmin>print Help.attributes(object) 
Attribute      Type       Access 
name       java.lang.String    RO 
maximumSize      int        RW 
minimumSize      int        RW 
inactivityTimeout    long       RW 
growable      boolean       RW 
stats       javax.management.j2ee.statistics.Stats RO 

wsadmin>print Help.operations(object) 
Operation 
java.lang.String getName() 
int getMaximumPoolSize() 
void setMaximumPoolSize(int) 
int getMinimumPoolSize() 
void setMinimumPoolSize(int) 
long getKeepAliveTime() 
void setKeepAliveTime(long) 
boolean isGrowAsNeeded() 
void setGrowAsNeeded(boolean) 
javax.management.j2ee.statistics.Stats getStats() 
+0

¿Respondió mi respuesta en absoluto al @ MD6380? – Gray

+0

Sí, eso ayudó. ¡Gracias! – MD6380

Respuesta

10

No puedo decir si está hablando de encontrar los MBeans desde dentro de la JVM actual o de forma remota desde un cliente. Hay una serie de bibliotecas de clientes JMX. El que yo escribí está disponible aquí:

http://256stuff.com/sources/simplejmx/

Con mi código que puede hacer algo como:

JmxClient client = new JmxClient(hostName, port); 
Set<ObjectName> objectNames = getBeanNames() 
for (ObjectName name : objectNames) { 
    MBeanAttributeInfo[] attributes = getAttributesInfo(name); 
    MBeanOperationInfo[] operations = getOperationsInfo(name); 
} 

Si usted está planteando la JVM actual, entonces usted debería ser capaz para obtener información de los beans internos de esta manera:

MBeanServer server = ManagementFactory.getPlatformMBeanServer(); 
Set<ObjectName> objectNames = server.queryNames(null, null); 
for (ObjectName name : objectNames) { 
    MBeanInfo info = server.getMBeanInfo(name); 
} 
2

Aquí hay un ejemplo con JMX simple para ActiveMQ. Puede ser útil para alguien en el futuro con solo reemplazar los valores de ActiveMQ:

String brokerName = "AMQBroker"; 
String username = ""; 
String password = ""; 
String hostname = "localhost"; 
int port = 1099; 

Map<String, Object> env = new HashMap<String, Object>(); 
if (username != null || password != null) { 
    String[] credentials = new String[] { username, password }; 
    env.put("jmx.remote.credentials", credentials); 
} 

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + hostname + ":" + port + "/jmxrmi"); 
JMXConnector jmxc = JMXConnectorFactory.connect(url, env); 
MBeanServerConnection conn = jmxc.getMBeanServerConnection(); 

// here is example for Type=Broker, can be different like 
// "org.apache.activemq:BrokerName=" + brokerName + ",Type=Connection,ConnectorName=openwire,Connection=*" 
// "org.apache.activemq:BrokerName=" + brokerName + ",*,Type=NetworkBridge" or same for Queue, Topic, Subscription 
ObjectName name = new ObjectName("org.apache.activemq:BrokerName=" + brokerName + ",Type=Broker"); 
Set<ObjectName> queryNames = conn.queryNames(name, null); 
// here is set with one element, but can be more depending on ObjectName query 
for (ObjectName objectName : queryNames) { 
    System.out.println(objectName.getCanonicalName()); 
    // use attribute you can be interested in 
    System.out.println(conn.getAttribute(objectName, "Slave")); 
} 
Cuestiones relacionadas