Java Language
JMX
Buscar..
Introducción
La tecnología JMX proporciona las herramientas para crear soluciones distribuidas, basadas en web, modulares y dinámicas para administrar y monitorear dispositivos, aplicaciones y redes impulsadas por servicios. Por diseño, este estándar es adecuado para adaptar sistemas heredados, implementar nuevas soluciones de administración y monitoreo, y conectarse a las del futuro.
Ejemplo simple con Platform MBean Server
Digamos que tenemos algún servidor que registra nuevos usuarios y los saluda con algún mensaje. Y queremos monitorear este servidor y cambiar algunos de sus parámetros.
Primero, necesitamos una interfaz con nuestros métodos de monitoreo y control.
public interface UserCounterMBean {
long getSleepTime();
void setSleepTime(long sleepTime);
int getUserCount();
void setUserCount(int userCount);
String getGreetingString();
void setGreetingString(String greetingString);
void stop();
}
Y una implementación simple que nos permitirá ver cómo está funcionando y cómo lo afectamos.
public class UserCounter implements UserCounterMBean, Runnable {
private AtomicLong sleepTime = new AtomicLong(10000);
private AtomicInteger userCount = new AtomicInteger(0);
private AtomicReference<String> greetingString = new AtomicReference<>("welcome");
private AtomicBoolean interrupted = new AtomicBoolean(false);
@Override
public long getSleepTime() {
return sleepTime.get();
}
@Override
public void setSleepTime(long sleepTime) {
this.sleepTime.set(sleepTime);
}
@Override
public int getUserCount() {
return userCount.get();
}
@Override
public void setUserCount(int userCount) {
this.userCount.set(userCount);
}
@Override
public String getGreetingString() {
return greetingString.get();
}
@Override
public void setGreetingString(String greetingString) {
this.greetingString.set(greetingString);
}
@Override
public void stop() {
this.interrupted.set(true);
}
@Override
public void run() {
while (!interrupted.get()) {
try {
System.out.printf("User %d, %s%n", userCount.incrementAndGet(), greetingString.get());
Thread.sleep(sleepTime.get());
} catch (InterruptedException ignored) {
}
}
}
}
Para un ejemplo simple con administración local o remota, necesitamos registrar nuestro MBean:
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
public class Main {
public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {
final UserCounter userCounter = new UserCounter();
final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
final ObjectName objectName = new ObjectName("ServerManager:type=UserCounter");
mBeanServer.registerMBean(userCounter, objectName);
final Thread thread = new Thread(userCounter);
thread.start();
thread.join();
}
}
Después de eso, podemos ejecutar nuestra aplicación y conectarla a través de jConsole, que se puede encontrar en su directorio $JAVA_HOME/bin
. Primero, necesitamos encontrar nuestro proceso java local con nuestra aplicación
luego cambie a la pestaña MBeans y encuentre el MBean que usamos en nuestra clase Main como ObjectName
(en el ejemplo anterior es ServerManager
). En la sección Attributes
podemos ver los atributos. Si ha especificado solo el método de obtención, el atributo será legible pero no grabable. Si especificara los métodos get y set, el atributo sería legible y grabable.
Los métodos especificados se pueden invocar en Operations
sección Operations
.
Si desea poder utilizar la administración remota, necesitará parámetros de JVM adicionales, como:
-Dcom.sun.management.jmxremote=true //true by default
-Dcom.sun.management.jmxremote.port=36006
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Estos parámetros se pueden encontrar en el Capítulo 2 de las guías JMX . Después de eso, podrá conectarse a su aplicación a través de jConsole de forma remota con jconsole host:port
o con la especificación de host:port
o service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
en jConsole GUI.
Enlaces útiles: