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 introduzca la descripción de la imagen aquí

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. introduzca la descripción de la imagen aquí

Los métodos especificados se pueden invocar en Operations sección Operations . introduzca la descripción de la imagen aquí

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:



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow