Java Language Exemple simple avec Platform MBean Server


Exemple

Disons que nous avons un serveur qui enregistre les nouveaux utilisateurs et les salue avec un message. Et nous voulons surveiller ce serveur et modifier certains de ses paramètres.

Tout d'abord, nous avons besoin d'une interface avec nos méthodes de surveillance et de contrôle

public interface UserCounterMBean {
    long getSleepTime();

    void setSleepTime(long sleepTime);

    int getUserCount();

    void setUserCount(int userCount);

    String getGreetingString();

    void setGreetingString(String greetingString);

    void stop();
}

Et une implémentation simple qui nous permettra de voir comment cela fonctionne et comment nous l'affectons

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) {
            }
        }
    }
}

Pour un exemple simple avec une gestion locale ou distante, nous devons enregistrer notre 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();
    }
}

Après cela, nous pouvons exécuter notre application et nous y connecter via jConsole, qui se trouve dans votre répertoire $JAVA_HOME/bin . Premièrement, nous devons trouver notre processus java local avec notre application entrer la description de l'image ici

puis passez à l'onglet MBeans et trouvez le MBean que nous avons utilisé dans notre classe Main en tant que ObjectName (dans l'exemple ci-dessus, il s'agit de ServerManager ). Dans la section Attributes , nous pouvons voir les attributs. Si vous avez spécifié la méthode get uniquement, l'attribut sera lisible mais pas accessible en écriture. Si vous avez spécifié les méthodes get et set, l'attribut serait lisible et accessible en écriture. entrer la description de l'image ici

Les méthodes spécifiées peuvent être appelées dans la section Operations . entrer la description de l'image ici

Si vous voulez pouvoir utiliser la gestion à distance, vous aurez besoin de paramètres JVM supplémentaires, tels que:

-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

Ces paramètres se trouvent au chapitre 2 des guides JMX . Après cela, vous pourrez vous connecter à votre application via jConsole à distance avec l' jconsole host:port ou en spécifiant l' host:port ou service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi dans l'interface graphique de jConsole.

Liens utiles: