1.14k likes | 1.25k Views
NSY102 Conception de logiciels Intranet JMX Java Management eXtension API. Cnam Paris jean-michel Douin, douin au cnam point fr version 25 Mai 2009. Architecture à base de composants. Sommaire. Objectifs Supervision d’une JVM, locale ou distante Une Première approche Un exemple simple
E N D
NSY102Conception de logiciels Intranet JMXJava Management eXtension API Cnam Paris jean-michel Douin, douin au cnam point fr version 25 Mai 2009 Architecture à base de composants
Sommaire • Objectifs • Supervision d’une JVM, locale ou distante • Une Première approche • Un exemple simple • Un Managed Bean (MBean) • Un agent • Une supervision comme démonstration • De plus près : 3 niveaux • Instrumentation • Standard, dynamic, open, model Beans et MXBeans. • Agent / serveur • Installation et accès aux « MBeans » • Distribué • Connecteurs et adaptateurs • Applette et JMX, Plug-in et JMX • En conclusion • Tout est ou deviendra MBean ? …
Bibliographie utilisée • La présentation de Christophe Ebro • http://rangiroa.essi.fr/cours/internet/02-JMX-partie2.pdf • L’indispensable tutoriel de Sun • http://java.sun.com/docs/books/tutorial/jmx/index.html • http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/ • Hello world • http://java.sun.com/j2se/1.5.0/docs/guide/jmx/examples.html • Le blog de Daniel Fuchs et celui de Luis-Miguel Alventosa • http://blogs.sun.com/jmxetc/http://blogs.sun.com/lmalventosa/ • JMX et Design Patterns chez hp • http://devresource.hp.com/drc/resources/jmxbestp_dp_pres/index.jsp • Côté développeur ibm • http://www-128.ibm.com/developerworks/java/library/j-jmx2/ Orienté MX4j, « date un peu » http://admc.com/blaine/howtos/jmx/ http://www.xmojo.org/products/xmojo/index.html Spécialisé MXBean / accès à la JVM • http://www-128.ibm.com/developerworks/java/library/j-mxbeans/ Divers • http://www-adele.imag.fr/users/Didier.Donsez/ujf/sujet/jmx.html
Pré-requis • Notions de • Introspection • En tant qu’utilisateur • Client/serveur, • Protocole JRMP( rmi) et HTTP • Patrons Factory, Publish-Subscribe, DynamicProxy
JMX : Objectifs • Supervision de JVM locales ou distantes • En cours d’exécution • Gestion/administration de Ressources • Matérielles comme logicielles • Configuration/déploiement/mise à jour • Statique et dynamique • Contrôle • Du Cycle de vie : start/stop/suspend/resume • De la Charge en vue d’une meilleure répartition • Supervision • Performance • Des erreurs/ exceptions • De l’état (cf. cycle de vie)
Supervision : mouture fine… • Détection de la mémoire utilisée • Déclenchement du ramasse-miettes, ou bien son arrêt • Chargement de classe en mode verbose • Détection d’un interblocage • Accès aux ressources de l’OS • Gestion d’application de type MBean • Gestion de serveurs • Gestion d’applettes ! • Au sein d’un navigateur • …
JMX API • Hypothèse : tout est JAVA-JVM • Ressources matérielles • Ressources logicielles • Depuis J2SE 1.5, mais 1.6 sera préféré, et JMX >= 1.4 • Adoptée par de nombreuses entreprises • http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/jmxadoption.jsp • Déjà présent au sein de plate-formes commerciales … JBoss, Apache, GlassFish, • Outils prédéfinis • jconsole, jvisualvm(1.6 update11), interface vers rmi/http/snmp/jini … • JDMK en open source • Java Dynamic Management Kit http://java.sun.com/products/jdmk/
Architecture • 3 niveaux • Instrumentation • Gestion de la ressource par un composant (MBean, Managed Bean) • Agents • Initialisation, installation et contrôle des MBean • Distribué/intégration • Adaptateurs de Protocoles • RMI/HTTP/SNMP-CMIP • Sécurité • Common Management Information Protocol (CMIP), protocole ISO • Simple Network Management Protocol (SNMP)
Schéma de Christophe Ebro de Sun • 3 niveaux instrumentation, serveur, distribué
Objectifs rappel contexte JVM • Accès à une JVM « de l’extérieur » • Supervicion d’une JVM en cours d’exécution … • Gestion d’objets Java déjà en place… MBean • Accès aux attributs (introspection) • Lecture/écriture • Appels de méthodes (introspection) • Passage de paramètres / retour de résultat • Notifications, (publish-subscribe) • évènements • Ajout dynamique de nouveaux objets MBean • Code des classes en place spécialisé • Code « hors-place » à télécharger • Retrait dynamique d’objets MBean • Un exemple vite …
Par l’exemple : un capteur… • SensorMBean Instrumentation • SensorAgent Serveur • Installation du service • Outil jconsole Distribué • Un client en standard (j2SE)
Un exemple comme présentation • SensorMBean • Sensor Instrumentation Outil de Sun jconsole Distribué • SensorAgent • Serveur
Instrumentation, Standard MBean // un capteur comme ressource public interface SensorMBean { // getter/setter public int getValue(); public void setValue(int val); // operations public void reset(); } MBean suffixe imposé … syntaxe à respecter
Remarques d’introspecteur … getter/setter selon Sun, une convention public int getValue(); public void setValue(int val); Un outil peut donc en déduire qu’il existe un attribut int value; accessible en lecture et en écriture
Sensor implements SensorMBean public class Sensor implements SensorMBean{ private final int PERIOD; private int value; private Acquisition local; // un thread interne source en annexe public Sensor(int period){ this.PERIOD = period; local = this.new Acquisition(); } public synchronized int getValue(){ return value; } public synchronized void setValue(int value){ this.value = value; } // operations public void reset(){… Class Sensorimposée …
Agent ou impresario • L’agent du bean se charge de • L’installation (instanciation) du MBean • L’enregistrement auprès du serveur de MBeans • MBeanServer • Un nom unique lui est attribué • en général par l’utilisateur, • selon une convention de nommage • Apparenté Properties exemple : SensorAgent:name=Sensor1 • namela clé, Sensor1 la valeur • Cet agent est ici installé sur la même JVM • D’autres peuvent le faire : un autre MBean, le serveur, de l’extérieur …
Agent : SensorAgent public class SensorAgent{ private MBeanServer mbs; public SensorAgent(){ try{ mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("SensorAgent:name=Sensor1"); Sensor mbean = new Sensor(2000);// création du mbean mbs.registerMBean(mbean, name); // enregistrement }catch(Exception e){ …} } public static void main(String[] args)throws Exception{ … new SensorAgent(); Thread.sleep(Long.MAX_VALUE); // la JVM reste active
Commentaires mbs = ManagementFactory.getPlatformMBeanServer(); Le gestionnaire de MBean inclus dans la JVM ObjectName name = new ObjectName("SensorAgent:name=Sensor1"); Un nom, éventuellement suivi de propriétés Sensor mbean = new Sensor(2000); Création du mbean mbs.registerMBean(mbean, name); Enregistrement auprès du gestionnaire
Distribué : jconsole • Accès à l’une des JVM, • Déjà équipée de son MBeanServer* LocalProcess SensorAgent (ici numérotation « windows ») Les PID des JVM : console> jps * Plusieurs MBeanServer Peuvent co-exister
Distribué : jconsole • name=Sensor1 • Accès aux attributs • getter/setter, par introspection
Distribué : jconsole • name=Sensor1 • Opération reset()
Distribué : jconsole • Onglet Threads, un MXBean abordé par la suite • SensorAgent est bien endormi…
Java VisualVM • visualVM • https://visualvm.dev.java.net/download.html • https://visualvm.dev.java.net/docindex.html • jconsole global
Résumé, Pause … • MBean • Un composant • Agent • Chargé du dialogue avec l’infrastructure(canevas/framework) • jconsole un outil prédéfini • C‘est une application Java • Accès aux MBean depuis n’importe quelle application • Locale ou distante
Jconsole comme SensorClient • SensorMBean • Sensor Instrumentation Outil de Sun jconsole • SensorAgent • SensorClient • SensorClient ou comment accéder au bean • Depuis une application java ordinaire ?
Client : SensorClient public class SensorClient{ // même JVM // SensorAgent a = new SensorAgent(); préalable MBeanServer mbs = …… // à la recherche du MBean ObjectName name = new ObjectName("SensorAgent:name=Sensor1"); // accès aux attributs par leur nom // accès à l’attribut, getValue() System.out.println(mbs.getAttribute(name, "Value")); …
SensorClient & DynamicProxy // ou bien à l’aide d’un dynamicProxy // un mandataire généré dynamiquement, du byte-code à la volée SensorMBean sensor = (SensorMBean) MBeanServerInvocationHandler.newProxyInstance( mbs, // MBeanServer name, // ObjectName SensorMBean.class, // interface false); // détaillé par la suite System.out.println(sensor.getValue()); sensor.reset(); DynamicProxy encore …
Résumé • Instrumentation un MBean • Serveur un agent qui pourrait devenir un MBean… • Client même JVM, à l’aide d’un mandataire dynamique • Distribué jconsole
Notifications • Réveil, alarmes, pannes … • Ou bien Notifications, évènements asynchrones, réseau ? • Patron Observateur distribué … • Publish-subscribe : filtre d’évènements possible • Notifications • Vers des JVM installées sur la même machine • Vers des JVM distantes Notification NotificationBroadcaster NotificationListener
Réveil & notifications • À la suite d’un changement d’état • Patron publish/subscribe, mode pull (pull : inscription à la demande du client)
Comment ? notify • Une classe prédéfinie • NotificationBroadcasterSupport sendNotification(Notification notification) Ajout/retrait d’un observateur/écouteur addNotificationListener( NotificationListener listener, NotificationFilter filter, Object handback) … removeNotificationListener( …
Comment : Listener • L’interface NotificationListener handleNotification(Notification notification, Object handback)
Comment ? • A chaque changement d’état une notification est effectuée • sendNotification (new Notification(….,….,….)); • Éventuellement filtrée • Interface NotificationFilter • booleanisNotificationEnabled(Notification notification) • Exécutée avant chaque notification • Une notification : classe Notification • Constructeurs • Notification(String type, Object source, long sequenceNumber) • Notification(String type, Object source, long sequenceNumber, long timeStamp, String message)
Avec SensorMBean public interface SensorMBean extends NotificationBroadcaster{ // getter/setter public int getValue(); public void setValue(int val); // operations public void reset(); }
Sensor • A chaque modification de la valeur du capteur • Une notification est engendrée • Notifications distantes sur le réseau • Arrivée possible dans le désordre estampille
Instrumentation & Notifications public class Sensor extends NotificationBroadcasterSupport implements SensorMBean{ public synchronized void setValue(int value){ this.value = value; this.sequenceNumber++; sendNotification( new Notification( "setValue", // un nom this, sequenceNumber, // un numéro System.currentTimeMillis(), // une estampille Integer.toString(value))); // un message }
L’ Agent & notifications • L’agent est un ici observateur de « son » MBean public class SensorAgent implements NotificationListener{ private MBeanServer mbs; public SensorAgent(){ try{ … mbean.addNotificationListener(this,null,null); }catch(Exception e){ e.printStackTrace(); } } public void handleNotification( Notification notification, Object handback){ System.out.print(notification.getMessage()); System.out.println(" number : " + notification.getSequenceNumber()); }
Client : jconsole & notifications jconsole a souscrit
SensorClient est un écouteur public class SensorClient implements NotificationListener{ public void handleNotification( Notification notification, Object handback){ …. } public static void main(String[] args) throws Exception { SensorAgent a = new SensorAgent(); // même JVM ici MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("SensorAgent:name=Sensor"); NotificationListener nl = new SensorClient(); SensorMBean sensor = (SensorMBean) MBeanServerInvocationHandler.newProxyInstance(mbs, name, SensorMBean.class, false); sensor.addNotificationListener(nl, null,null);
SensorClient : le mandataire encore lui SensorMBean sensor = (SensorMBean) MBeanServerInvocationHandler.newProxyInstance(mbs, name, SensorMBean.class, true); true retourne un proxy qui impléménte l’interface NotificationEmitter, soit la possibilité de retirer un écouteur de ce MBean (par procuration …) SensorMBean sensor = (SensorMBean) MBeanServerInvocationHandler.newProxyInstance( mbs, name, SensorMBean.class, true); … ((NotificationEmitter)sensor).removeNotificationListener(nl, null, null) ;
Petite conclusion • À la mode des Bean-Java • Getter/setter, opérations • Standard MBean comme suffixe … Instrumentation • Enregistrement de ce MBean … Agent • Supervision jconsole, clients • visualVM • Notifications jconsole, clients • Simple ! • À suivre…
Sommaire Maintenant d’un peu plus près
Instrumentation MBeans 5 types • Standard : engendré depuis une interface xxxMBean • Voir l’exemple de présentation • Dynamic : n’importe quel objet, • fonctionnalités découvertes à l’exécution • Model : configurable, une template à instancier • Open : limité à un ensemble de type Java • Inhibe les téléchargements de code • MXBean 1.6 : accès aux ressources de la JVM
DynamicMBean • Interface connue à l’exécution • Liste des attributs construite au démarrage du MBean • Une description de ces attributs par exemple dans un fichier XML • Tout simplement un Proxy d’accès au MBean
DynamicMBean • Par introspection … • c’est un mandataire String/JVM
Dynamic • Accès de l’extérieur … • possible avec des noms d’attributs ou d’opérations • Il sera possible de les télécharger …
Exemple du capteur, il faut tout écrire… public class SensorDynamic extends NotificationBroadcasterSupport implements DynamicMBean { public SensorDynamic() { buildDynamicMBeanInfo(); } public Object getAttribute(String attributeName) throws AttributeNotFoundException, MBeanException, ReflectionException { if (attributeName.equals("Value")) { return getValue(); } … Voir http://java.sun.com/j2se/1.5.0/docs/guide/jmx/examples.html
DynamicMBean • Proposer une « signature » du composant • getMBeanInfo() retourne cette signature • Les méta-données MBeanInfo décrivent les attributs, opérations et notifications • Utilisation ad’hoc • Un adaptateur d’objets Java existants afin de les rendre « compatibles MBean »
Instrumentation MBeans 5 types • Standard : engendré depuis une interface xxxMBean • Dynamic : n’importe quel objet, • fonctionalités découvertes à l’exécution • Model : configurable, une template à instancier • Open : limité à un ensemble de type Java • Inhibe les téléchargements de code • MXBean 1.6 : accès aux ressources de la JVM
ModelMBean • Avertissement : • Model MBeans are a particularly advanced feature of the JMX API. It is perfectly possible to produce an entirely adequate set of MBeans without ever using Model MBeans. • Model MBeans are harder to program so they should only be used when there is a clear benefit. • Donc … • À lire : The Jakarta Commons Modeler from the Apache Software Foundation builds on the Model MBean framework to allow you to specify MBean interfaces, including descriptors etc, using XML. The attributes and operations mentioned in XML are forwarded to an instance of a Java class that does not have to be an MBean class. The main advantage of this approach is perhaps that the entire information model can be contained in a single XML file. The main disadvantage is that there is no Java interface corresponding to the management interface of a given MBean, which means that clients cannot construct proxies.