NSY102 1 NSY102 Conception de logiciels Intranet JMX Java Management eXtension API Architecture à base de composants Cnam Paris jean-michel Douin, douin.

Slides:



Advertisements
Présentations similaires
Applettes et Java Web Start
Advertisements

Le struts validator – framework de validation
« Les Mercredis du développement » Introduction Office « 12 » Présenté par Bernard Fedotoff Microsoft Regional Director Agilcom.
Gestion des événements (suite)
Introspection et Réflexion Manipulation dynamique de code Java.
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
jean-michel Douin, douin au cnam point fr
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Exposé de Système - Informatique et Réseau
CONTINUOUS TESTING Hakima Zidouri Informatique Réseau 3
Approfondissement du langage
JAV - TD 6 Structures de données JAVA
Design Pattern MVC En PHP5.
TP 3-4 BD21.
Servlet JAVA.
Programmation par Objets et Java
LOG 02 Bases de Données Avancées Rappels sur JSP / Servlet
Programmation orientée objet
XML-Family Web Services Description Language W.S.D.L.
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Struts 1 & 2 Tlohi ibtissam Tabit boutaina Ilias bouras
ESIEE 1 JMX Java Management eXtension API Architecture à base de composants Cnam Paris jean-michel Douin, douin au cnam point fr version 19 Février 2008.
M2 – MIAGE/SID Servlet M2 – MIAGE/SID
Projet JAVA EE Approfondi
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
.Net Remoting.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Framework Play 2.0 Démonstration du proof of concept
Architecture dun site de vente au détail1 Modèle d'un site simple de vente Lexemple du livre Ruby on Rails Partie II Java Adventure Builder Demo Réalisé.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
J2EE vs .NET Réaliser par : SEIF ENNACER BADRA && CHETOUI RIM.
M2 – MIAGE/SID Servlet M2 – MIAGE/SID
APPLETS. Applets : généralités Applet : application s'exécutant dans une page HTML Le ByteCode (fichiers.class) est téléchargé depuis un serveur. L'exécution.
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
0 Objectifs de la session n°1  Revenir sur toutes les bases théoriques nécessaires pour devenir un développeur Web,  Découvrir l’ensemble des langages.
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Créer des packages.
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Masters IIGLI et ILGII – Intranet internet extranet – – Claude Montacié 1 Cours n° 10 Accès distant aux bases de données.
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
Les sockets.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Présentation du framework JSF (Java Server Faces) dans le modèle événementiel MVCII
 Formulaires HTML : traiter les entrées utilisateur
Cours MIAGE « Architectures Orientées Services »Henry Boccon-GibodCours MIAGE « Architectures Orientées Services »Henry Boccon-Gibod 1 Architectures Orientées.
Les Servlets Présentation Cycle de vie Principe de fonctionnement
PaCO++ André Ribes Réunion Hydrogrid Rennes 15/09/03.
Introduction aux outils de supervision
Les Java Server Pages Dans ce chapitre, nous allons :
Module 2 : Planification de l'installation de SQL Server
CPI/BTS 2 Programmation Web Les sites dynamiques Prog Web CPI/BTS2 – M. Dravet – 02/10/2003 Dernière modification: 02/10/2003.
L. Gurret – M. Herve – P. Mignon – J. Prarioz. Introduction  Dernière étape d’analyse  Cahier des charges, spécifications et conception orientée objet.
Java Remote Method Invocation
© - Last update: Sunday, 31 January Master « Technologies de l’Internet » - UPPA.
OAI-PMH & LOM OAI Repository interoperability using LOM metadata format Interopérabilité des bases de ressources utilisant OAI-PMH et LOM Steve Giraud.
BlueJ_VII 1 Java, les objets : tout de suite ! Conception de classes (1) Notes de cours associées au chapitre 7 tutorial BlueJ
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Java Réalisé par: Mouna POKORA. PLAN: Définition : Historique: Caractéristiques: un langage orienté objet: un langage interprété : un langage portable:
Parquet Geoffrey 3 ARIL EXIA.CESI ARRAS. Présentation du MLD Présentation de la persistance Présentation récapitulatif du projet JSP/SERVLET MVC Cycle.
jean-michel Douin, douin au cnam point fr
Transcription de la présentation:

NSY102 1 NSY102 Conception de logiciels Intranet JMX Java Management eXtension API Architecture à base de composants Cnam Paris jean-michel Douin, douin au cnam point fr version 25 Mai 2009

NSY102 2 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 ? …

NSY102 3 Bibliographie utilisée La présentation de Christophe Ebro – L’indispensable tutoriel de Sun – – Hello world – Le blog de Daniel Fuchs et celui de Luis-Miguel Alventosa – JMX et Design Patterns chez hp – Côté développeur ibm – Orienté MX4j, « date un peu » Spécialisé MXBean / accès à la JVM – Divers –

NSY102 4 Pré-requis Notions de –Introspection En tant qu’utilisateur –Client/serveur, Protocole JRMP( rmi) et HTTP –Patrons Factory, Publish-Subscribe, DynamicProxy

NSY102 5 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)

NSY102 6 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 …

NSY102 7 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 – –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

NSY102 8 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)

NSY102 9 Schéma de Christophe Ebro de Sun 3 niveaux instrumentation, serveur, distribué

NSY 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 …

NSY Par l’exemple : un capteur… SensorMBeanInstrumentation SensorAgentServeur –Installation du service Outil jconsoleDistribué –Un client en standard (j2SE)

NSY Un exemple comme présentation SensorMBean Sensor Instrumentation SensorAgent Serveur Outil de Sun jconsole Distribué

NSY Instrumentation, Standard MBean // un capteur comme ressource public interface Sensor MBean { // getter/setter public int getValue(); public void setValue(int val); // operations public void reset(); } MBean suffixe imposé … syntaxe à respecter

NSY 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

NSY 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 Sensor imposée …

NSY 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 »name la 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 …

NSY 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

NSY 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

NSY 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

NSY Distribué : jconsole name=Sensor1 –Accès aux attributs getter/setter, par introspection

NSY Distribué : jconsole name=Sensor1 –Opération reset()

NSY Distribué : jconsole Onglet Threads, un MXBean abordé par la suite –SensorAgent est bien endormi…

NSY Java VisualVM visualVM – – jconsole global

NSY 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

NSY Jconsole comme SensorClient SensorMBean Sensor Instrumentation SensorAgent SensorClient Outil de Sun jconsole SensorClient ou comment accéder au bean Depuis une application java ordinaire ?

NSY 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")); …

NSY 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 …

NSY 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

NSY 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

NSY Réveil & notifications À la suite d’un changement d’état –Patron publish/subscribe, mode pull (pull : inscription à la demande du client)

NSY 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( …

NSY Comment : Listener L’interface NotificationListener handleNotification(Notification notification, Object handback)

NSY Comment ? A chaque changement d’état une notification est effectuée –sendNotification (new Notification(….,….,….)); Éventuellement filtrée –Interface NotificationFilter boolean isNotificationEnabled(Notification notification) isNotificationEnabled – 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)

NSY Avec SensorMBean public interface SensorMBean extends NotificationBroadcaster { // getter/setter public int getValue(); public void setValue(int val); // operations public void reset(); }

NSY 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

NSY 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 }

NSY 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()); }

NSY Client : jconsole & notifications jconsole a souscrit

NSY 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);

NSY 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) ;

NSY 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…

NSY Sommaire Maintenant d’un peu plus près

NSY 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

NSY 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

NSY DynamicMBean Par introspection … – c’est un mandataire String/JVM

NSY 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 …

NSY 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

NSY 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 »

NSY 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

NSY 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.Jakarta Commons Modeler

NSY Model configurable, une template à instancier lors de l’exécution Extrait de

NSY ModelMBeanInfo private ModelMBeanInfo createMBeanInfo() { Descriptor atDesc = new DescriptorSupport( new String[] { "name=Value", "descriptorType=attribute", "default=0", "displayName=Value of the Sensor", "getMethod=getValue", "setMethod=setValue" } ); ModelMBeanAttributeInfo [] mmbai = new ModelMBeanAttributeInfo[1]; mmbai[0] = new ModelMBeanAttributeInfo("Value","java.lang.Integer", "The Sensor Value", true,true, false, atDesc); …

NSY RequiredMBeanInfo ObjectName name; name = new ObjectName("MBean:name=Sensor"); RequiredModelMBean modelmbean; modelmbean = new RequiredModelMBean(createMBeanInfo()); server.registerMBean(modelmbean, name); Model MBeans are harder to program …

NSY 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

NSY OpenMBean Limité à un sous-ensemble –Optimisé en espace et temps d’exécution –Seulement des types primitifs java –Et ne nécessite pas de recompilation, téléchargement de.class Voir OpenMBeanInfo

NSY 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 MXBean : accès aux ressources de la JVM

NSY MXBean Compilation CompilationMXBean Garbage collection system GarbageCollectorMXBean Memory MemoryMXBean Memory managers MemoryManagerMXBean Threading ThreadMXBean Operating system OperatingSystemMXBean Runtime system RuntimeMXBean Class loading system ClassLoadingMXBean Memory resources MemoryPoolMXBean

NSY Un exemple : ThreadAgent, ThreadMXBean public class ThreadAgent{ private MBeanServer mbs; public ThreadAgent(){ try{ ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("ThreadAgent:name=thread1"); mbs.registerMBean(mbean, name); }catch(Exception e){ e.printStackTrace(); } public static void main(String[] args)throws Exception{ … new ThreadAgent(); … Thread.sleep(Long.MAX_VALUE);

NSY Distribué : jconsole (ThreadAgent==MemoryAgent … de la syntaxe)

NSY Sommaire Agents

NSY Agents Adaptateurs et connecteurs MBean server Interrogation et listage Chargement dynamique Agent de services

NSY Distribué, Connector, Adapter Un connector –Est un MBean, –Est enregistré auprès du “MBean server”, –Communique avec une machine (paire) –Exemple Un rmi connecteur Un adapter –Est un MBean, –Est enregistré auprès du “MBean server”, –Ecoute sur un port et respecte un certain protocole. –Exemple Un adapter HTML accepte des requêtes au protocole HTTP Un client type est un navigateur

NSY Les connecteurs RMI TCP dédié

NSY Rmi connecteur, SensorAgent try { MBeanServer mbs …. name = new ObjectName("SensorAgent:name=Sensor2"); mbs.registerMBean(sensorBean, name); // Création et démarrage du connecteur côté serveur JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server"); // Création JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); // Démarrage cs.start(); } catch(Exception e) { }

NSY java/rmi + jconsole start rmiregistry 9999 l’annuaire –Côté MBeanServer

NSY RmiClient public class RMIClient{ public static void main(String[] args) throws Exception{ // à la recherche du connecteur, via l’annuaire JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server"); JMXConnector cs = JMXConnectorFactory.connect(url); MBeanServerConnection mbs = cs.getMBeanServerConnection(); ObjectName name = new ObjectName("SensorAgent:name=Sensor2"); System.out.println(" value : " + mbs.getAttribute(name, "Value")); // à l’aide d’un dynamic proxy … SensorMBean sensor = (SensorMBean) MBeanServerInvocationHandler.newProxyInstance(mbs, name, SensorMBean.class, false); System.out.println(sensor.getValue()); }}

NSY Notification distante… import javax.management.NotificationEmitter; public interface SensorMBean extends NotificationEmitter { // getter/setter public int getValue(); public void setValue(int val); // operations public void reset(); }

NSY Souscription locale auprès du MBean distant url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi:// :9999/server"); connector = JMXConnectorFactory.connect(url); mbean = new ObjectName("SensorAgent:name=Sensor2"); // le mandataire, décidément SensorMBean sensor = ( SensorMBean ) MBeanServerInvocationHandler.newProxyInstance( connector.getMBeanServerConnection(), mbean, SensorMBean.class, false); sensor.addNotificationListener(this,null,null);

NSY Notification, déjà vue public void addNotificationListener (ObjectName, NotificationListener, NotificationFilter, handback) public void removeNotificationListener (ObjectName name, NotificationListener listener) Voir NotificationEmitter

NSY Les adaptateurs Navigateur  html adaptateur

NSY Html adaptateur, SensorAgent try { MBeanServer mbs …. name = new ObjectName("SensorAgent:name=Sensor2"); mbs.registerMBean(sensorBean, name); // Creation et démarrage de l’adaptateur HtmlAdaptorServer adapter = new HtmlAdaptorServer();//* adapter.setPort(8088); name = new ObjectName("HtmlAdaptorServer:name=html,port=8088"); mbs.registerMBean(adapter, name); adapter.start(); * import com.sun.jdmk.comm.*; // jdmkrt.jar

NSY Le Client est un navigateur

NSY Client, navigateur Sans oublier, jdmkrt.jar dans le classpath –Bluej voir le répertoire lib/userlib/ ou./+libs/ –java -cp.;../JMX/jdmkrt.jar ThreadAgent

NSY A la recherche du MBean ? MBean en connaissant son nom : ok Tous les MBean d’un certain type ? Tous les MBean dont l’attribut « Counter » == 10 Tous les MBean dont l’attribut « Counter » >= 10 et dont l’estampille < X « QL » pour les MBean ? MQL ? –QueryExp –Expression booléenne

NSY QueryExp, comme composite… QueryExp exp = Query.gt(Query.attr("count"), Query.value(10)) QueryExp prob1 = Query.eq(Query.attr("inkLevel"), Query.value("LOW")); QueryExp prob2 = Query.lt(Query.attr("paperCount"), Query.value(50)); QueryExp exp = Query.or(prob1, prob2); "(inkLevel = LOW) or (paperCount < 50)"

NSY Chargement dynamique de MBean Agent M-Let Description XML

NSY M-Let Comment –M-Let agent

NSY Chargement dynamique de MBean M-Let –« URLClassLoader » Associé à un descripteur en XML Descripteur XML, nommé sensor.mlet, à cette URL

NSY Mlet en séquence

NSY Agent M-let public MLetAgent(){ try{ mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("Services:name=mlet"); mbs.createMBean("javax.management.loading.MLet", name); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server"); JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); cs.start(); }catch(Exception e){ e.printStackTrace(); }

NSY Agent M-Let Téléchargement dynamique du MBean Sensor –Appel de getMBeansFromURL( " " ) Sensor À la volée!

NSY MLetBean public interface MLetMBean { public Set getMBeansFromURL(String url) throws ServiceNotFoundException; public Set getMBeansFromURL(URL url) throws ServiceNotFoundException; public void addURL(URL url); public void addURL(String url) throws ServiceNotFoundException; public URL[] getURLs(); public URL getResource(String name); public InputStream getResourceAsStream(String name); public Enumeration getResources(String name) throws IOException; public String getLibraryDirectory(); public void setLibraryDirectory(String libdir); }

NSY M-Let File [ ] [ ] –Adaptés au constructeurs avec paramètres –Exemple

NSY Retrait dynamique de MBean mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name=… mbs.unregister(name) –À faire avec jconsole …

NSY Sommaire

NSY Interrogations au sujet des MBeans MBeanInfo meta-data: mbs.getMBeanInfo(objName); –Dynamic comme Standard MBeans And you can also run a type-check: mbs.isInstanceOf(objName, className)

NSY Accès au MBean : MBeanInfo Interface respectée par un Mbean –Les attributs et les opérations disponibles –Ces instances sont immutables getClassName() –Le nom de la classe getConstructors() –La liste des constructeurs getAttributes() –La liste des attributs Syntaxe getName() et setName() Name est l’attribut getOperations() –Opérations accessibles Syntaxe autre qu’un attribut getNotifications() –À la condition que ce Mbean implémente l’interface NotificationBroadcaster NotificationBroadcaster ( Ce sera NotificationBroadcaster.getNotificationInfo() qui sera déclenchée) NotificationBroadcaster.getNotificationInfo()

NSY MBeanInfo et plus …

NSY Un petit dernier, une applette Comment intervenir sur une applette de navigateur … Est-ce bien utile ? –Supervision chez le client à son insu ? Ou comment intervenir sur une application téléchargée –Par exemple avec java web start –Toujours à son insu … –Un petit et dernier exemple en 4 transparents Une applette incluant serveur web supervisée chez le client

NSY JConsole et Applet Extrait de Développer 1.une interface AppletteXXXXXMBean 2.une classe AppletteXXXXX extends JApplet implements AppletteXXXXXMBean 3.Puis générer l’archive AppletteXXXXX.jar Générer un certificat keytool -genkey -alias nsy -keypass PWD -keystore nsystore -storepass PWD Signer l’archive jarsigner -keystore nsystore AppletteXXXXX.jar nsy Exemple : ici C’est une page html standard <applet code="AppletteServeurWeb.class" width=500 height=200 archive="AppletteServeurWeb.jar" >

NSY JConsole et Applet démo Un client :

NSY Jconsole et Applet : un exemple en images Cliquer sur valider engendre une nouvelle fenêtre avec le résultat de la requête effectuée en

NSY Jconsole et applet suite Un scenario : –1) arreterServeurWeb –2) demarrerServeurWeb port 8200 –3) ouvrir un nouvel onglet sur le navigateur puis recharger la page initiale 2 serveurs en cours d’exécution 8100 et 8200 –4) applet_i_2 est apparu dans l’onglet MBeans de jconsole –…

NSY L’interface « Mbean » de l’applette public interface AppletteServeurWebMBean{ // opérations public void demarrerServeurWeb(int port); public void arreterServeurWeb(); // lectures, getter public int getPort(); public boolean getServeurActif(); public String getHostCodeBase(); public String getDerniereRequete(); }

NSY L’applette, un extrait du code source private static AtomicInteger applet_id = new AtomicInteger(1); private MBeanServer mbs; private ObjectName name; public void init(){ // initialisation de l’applette // et de son MBean... mbs = ManagementFactory.getPlatformMBeanServer(); name = new ObjectName("AppletteMBean: type=AppletteServeurWeb, "+ "name=applet_id_" + applet_id.getAndIncrement()); mbs.registerMBean(this, name); } public synchronized void stop(){ // terminaison de l’applette // et de son MBean... mbs.unregisterMBean(name); } source complet ici

NSY Conclusion JMX est bien un framework/canevas –MBean –Plug-in Plug-in et JMX installer pour voir celui-ci : voir également jconsole et jvisualVM deux utiles outils de supervision, et simples d’utilisation

NSY jconsole Les sources de sun : sun/tools/jconsole/ sun/tools/jconsole/inspector/ sun/tools/jconsole/resources/ com/sun/tools/jconsole/

NSY Luis-Miguel Alventosa’s Blog Luis-Miguel Alventosa show how to use JMX Monitoring & Management with both Applets and Web Start Applications. [July 6, 2006]AppletsWeb Start Applications – Voir aussi jconsole -pluginpath topthreads.jar –

NSY jconsole -pluginpath topthreads.jar –Onglet Top threads

NSY MBean Cycle de vie Extrait de ce livre, –chapitre 9 : Designing with JMX Paragraphe 3 MBean Registration and Lifecycle

NSY Création locale et enregistrement

NSY Création du MBean et enregistrement

NSY Création depuis une application externe

NSY Création par un adaptateur

NSY Création au démarrage

NSY M-let et notifications Être prévenu d’un téléchargement Voir l’adaptateur livre page 241

NSY MXBean JMX 1.4 et les annotations L’exemple de sun public interface QueueSamplerMXBean { public QueueSample getQueueSample(); public void clearQueue(); } public class QueueSampler implements QueueSamplerMXBean { private Queue queue; public QueueSampler(Queue queue) { this.queue = queue; } public QueueSample getQueueSample() { synchronized (queue) { return new QueueSample(new Date(), queue.size(), queue.peek()); } public void clearQueue() { synchronized (queue) { queue.clear(); }

NSY MXBean 1.4 public class QueueSample { private final Date date; private final int size; private final String "size", "head"}) public QueueSample(Date date, int size, String head){ this.date = date; this.size = size; this.head = head; } public Date getDate() { return date; } public int getSize() { return size; } public String getHead() { return head; } }

NSY CompositeData MBeanServer mbs =...whatever...; ObjectName name = new ObjectName("com.example.mxbeans:type=QueueSampler"); CompositeData queueSample = (CompositeData) mbs.getAttribute(name, "QueueSample"); int size = (Integer) queueSample.get("size"); MBeanServer mbs =...whatever...; ObjectName name = new ObjectName("com.example.mxbeans:type=QueueSampler"); QueueSamplerMXBean proxy = JMX.newMXBeanProxy(mbs, name, QueueSamplerMXBean.class); QueueSample queueSample = proxy.getQueueSample(); int size = queueSample.getSize();

NSY JMX-JBoss

NSY Sécurisé les accès Extrait de Securing the ConnectorServer Your agent code looks something like : JMXConnectorServer server = JMXConnectorServerFactory. newJMXConnectorServer(new JMXServiceURL("service:jmx:ws:" + "//localhost:8080/jmxws"), null, ManagementFactory.getPlatformMBeanServer()); server.start(); So how do you enable HTTPS? Simply by changing the protocol name when creating the JMXServiceURL to be ws-secure instead of ws. So now your code looks like : JMXConnectorServer server = JMXConnectorServerFactory. newJMXConnectorServer(new JMXServiceURL("service:jmx:ws- secure:" + "//localhost:8080/jmxws"), null, ManagementFactory.getPlatformMBeanServer()); server.start();

NSY Sécurisé les accès Are you done? Not yet, you need to provide a KeyStore location and a KeyStore password for SSL to find the certificates. You don't have a KeyStore or a certificate? Not a big deal, use keytool! For example call : keytool -genkey -keystore jsr262Keystore -keyalg RSA java -classpath... - Djavax.net.ssl.keyStore=jsr262Keystore - Djavax.net.ssl.keyStorePassword= MyJMXAgent // Create the SSLContext SSLContext ctx = TestSSLContext.getInstance("SSLv3"); // Create an env map Map env = new HashMap(1); // Provide the SSLContext env.put("jmx.remote.ws.sslcontext", ctx); // Create the ConnectorServer providing the env map JMXConnectorServer server = JMXConnectorServerFactory. newJMXConnectorServer(new JMXServiceURL("service:jmx:ws-secure:" + "//localhost:8080/jmxws"), env, ManagementFactory.getPlatformMBeanServer()); server.start();

NSY Source Sensor.Acquisition public class Sensor implements SensorMBean{ …. private class Acquisition extends Thread implements java.io.Serializable{ private Random random= new Random(); public Acquisition(){ random= new Random(); start(); } public void run(){ int valeur = 0; try{ while(!isInterrupted()){ Thread.sleep(PERIOD/2); //int value = random.nextInt(100); Sensor.this.setValue(valeur); Thread.sleep(PERIOD/2); System.out.println("." + valeur); valeur++; } }catch(InterruptedException ie){} }