Exercices dirigés NSY102

JMX, selon le synopsis du cours.

 

Depuis Bluej, l'archive à télécharger ed_jmx_a_completer.jar (puis ouvrir non_bluej ...., selon la procédure habituelle)

(en salle d'ED 31-3-XX, utilisez enregistrez la cible sous ...)

 

Question1 : Soit la classe Sensor ci dessous, qui simule un capteur et l'acquisition cyclique d'une valeur

import java.util.Random;
public class Sensor /* à compléter */{

  private final int PERIOD;
  private int value;
  private Acquisition local;
 
  public Sensor(int period){
    this.PERIOD = period;
    local = this.new Acquisition();
  }
    
  public Sensor(){
    this(2000);
  }
  
  public synchronized int getValue(){
    return value;
  }
  
  public synchronized void setValue(int value){
    this.value = value;
  }
      
  // operations 
  public void reset(){
    local.interrupt();
    try{local.join();}catch(InterruptedException ie){}
    local = this.new Acquisition();
  }
  
  public void stop(){
    local.interrupt();
    try{local.join();}catch(Exception e){}
  } 
  private class Acquisition extends Thread implements java.io.Serializable{
    private Random random= new Random();
    public Acquisition(){
      random= new Random();
      start();
    }
    public void run(){
      try{
        while(!isInterrupted()){
          Thread.sleep(PERIOD);
          int value = random.nextInt(100);
          Sensor.this.setValue(value);
          System.out.println("." + value);
        }
      }catch(InterruptedException ie){}
    }
  }

}

Proposez une interface afin que cette classe puisse devenir un composant MBean/JMX,

Cette interface propose toutes les 4 méthodes publiques de la classe Sensor,

puis modifiez la classe Sensor afin que celle-ci "implémente" bien cette interface.

Enfin Valider la classe de tests TestQuestion1

 

Question2 : Complétez la classe SensorAgent, seulement le constructeur, à la création de l'instance de cette classe, le "MBean" de la question précédente est enregistré auprès de votre plate-forme ( ManagementFactory.getPlatformMBeanServer();)

Choississez ce nom : SensorAgent:name=Sensor, et en exécutant la méthode main de la classe SensorAgent,

1) Exécutez la commande depuis une console :

ed_jmx> java -cp . SensorAgent

2) avec jconsole, onglet MBeans, item Operations, vous devriez obtenir les opérations permises (reset, stop)

 

Valider la classe de tests TestQuestion2

 

Question3 : Ajouter le connecteur RMI, en complétant la méthode setRMIConnector, vérifiez le bon fonctionnement

ci-dessous un extrait de code qui pourrait vous être utile (conservez le port 9999 et le nom sensor) :

// Create an RMI connector and start it
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/sensor");
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();

avec mbs = ManagementFactory.getPlatformMBeanServer();

A la page d'accueil de jconsole, choississez Remote Process avec cette URL : service:jmx:rmi:///jndi/rmi://localhost:9999/sensor

Valider la classe de tests TestQuestion3

 

Question4 : Ajouter l'adaptateur HTTP fourni par Sun (archive jdmkrt.jar), en complétant la méthode setHTTPAdapter

ci-dessous un extrait de code qui pourrait vous être utile ... :

    HtmlAdaptorServer adapter = new HtmlAdaptorServer();
    adapter.setPort(port);
    ObjectName name = new ObjectName("HtmlAdaptorServer:name=html,port=" + port);
    mbs.registerMBean(adapter, name);
    adapter.start();
import com.sun.jdmk.comm.*;

http://localhost:8082

Valider avec votre navigateur

Question5 : Chaque changement de valeur du capteur engendre une notification, cette notification à 4 arguments, classe Notification

le type par exemple "Sensor.setValue",
l'origine de la notification,
un nombre unique permettant une indentification ,
un paramètre comme la valeur du capteur

Modifiez en conséquence la classe Sensor (voir la classe NotificationBroadcasterSupport)

 

avec jconsole, onglet MBeans, l'item Notifications doit apparaître à cette question

sélectionner l'item Notifications et souscrivez, toutes les 2 secondes une nouvelle notification a lieu et est affichée

Valider la classe de tests TestQuestion5