Upload
landis
View
30
Download
0
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
NSY1021
NSY102Conception de logiciels Intranet
JMXJava Management eXtension API
Architecture à base de composants
Cnam Parisjean-michel Douin, douin au cnam point fr
version 25 Mai 2009
NSY1022
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 ? …
NSY1023
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
NSY1024
Pré-requis
• Notions de
– Introspection• En tant qu’utilisateur
– Client/serveur, • Protocole JRMP( rmi) et HTTP
– Patrons Factory, Publish-Subscribe, DynamicProxy
NSY1025
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)
NSY1026
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
• …
NSY1027
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/
NSY1028
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)
NSY1029
Schéma de Christophe Ebro de Sun
• 3 niveaux instrumentation, serveur, distribué
NSY10210
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 …
NSY10211
Par l’exemple : un capteur…
• SensorMBeanInstrumentation
• SensorAgentServeur
– Installation du service
• Outil jconsoleDistribué
– Un client en standard (j2SE)
NSY10212
Un exemple comme présentation
• SensorMBean• Sensor
Instrumentation
• SensorAgent
Serveur
Outil de Sun jconsole
Distribué
NSY10213
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
NSY10214
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
NSY10215
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 …
NSY10216
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 …
NSY10217
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
NSY10218
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
NSY10219
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
NSY10220
Distribué : jconsole
• name=Sensor1– Accès aux attributs
• getter/setter, par introspection
NSY10221
Distribué : jconsole
• name=Sensor1– Opération reset()
NSY10222
Distribué : jconsole
• Onglet Threads, un MXBean abordé par la suite
– SensorAgent est bien endormi…
NSY10223
Java VisualVM
• visualVM –https://visualvm.dev.java.net/download.html
•https://visualvm.dev.java.net/docindex.html
– jconsole global
NSY10224
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
NSY10225
Jconsole comme SensorClient
• SensorMBean• Sensor
Instrumentation
• SensorAgent
• SensorClient
Outil de Sun jconsole
•SensorClient ou comment accéder au bean
Depuis une application java ordinaire ?
NSY10226
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"));
…
NSY10227
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 …
NSY10228
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
NSY10229
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
NSY10230
Réveil & notifications
• À la suite d’un changement d’état– Patron publish/subscribe, mode pull (pull : inscription à la demande du client)
NSY10231
Comment ? notify
• Une classe prédéfinie–NotificationBroadcasterSupport
sendNotification(Notification notification)
Ajout/retrait d’un observateur/écouteuraddNotificationListener(
NotificationListener listener, NotificationFilter filter, Object handback) …
removeNotificationListener( …
NSY10232
Comment : Listener
• L’interface NotificationListener
handleNotification(Notification notification,
Object handback)
NSY10233
Comment ?
• A chaque changement d’état une notification est effectuée– sendNotification (new Notification(….,….,….));
• Éventuellement filtrée– Interface NotificationFilter
• boolean isNotificationEnabled(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)
NSY10234
Avec SensorMBean
public interface SensorMBean extends NotificationBroadcaster{
// getter/setter
public int getValue();
public void setValue(int val);
// operations
public void reset();
}
NSY10235
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
NSY10236
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 }
NSY10237
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());
}
NSY10238
Client : jconsole & notifications
jconsole a souscrit
NSY10239
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);
NSY10240
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) ;
NSY10241
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…
NSY10242
Sommaire
Maintenant d’un peu plus près
NSY10243
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
NSY10244
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
NSY10245
DynamicMBean
• Par introspection …– c’est un mandataire String/JVM
NSY10246
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 …
NSY10247
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
NSY10248
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 »
NSY10249
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
NSY10250
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.
NSY10251
Model
• configurable, une template à instancier lors de l’exécution
Extrait de http://www-128.ibm.com/developerworks/java/library/j-jmx2/
NSY10252
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); …
NSY10253
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 …
NSY10254
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
NSY10255
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
NSY10256
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
NSY10257
MXBean
• Compilation CompilationMXBean• Garbage collection system GarbageCollectorMXBean• Memory MemoryMXBean• Memory managersMemoryManagerMXBean• Threading ThreadMXBean• Operating system OperatingSystemMXBean• Runtime system RuntimeMXBean• Class loading system ClassLoadingMXBean• Memory resourcesMemoryPoolMXBean
NSY10258
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);
NSY10259
Distribué : jconsole (ThreadAgent==MemoryAgent … de la syntaxe)
NSY10260
Sommaire
Agents
NSY10261
Agents
• Adaptateurs et connecteurs
• MBean server
• Interrogation et listage
• Chargement dynamique
• Agent de services
NSY10262
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
NSY10263
Les connecteurs
• RMI• TCP dédié
NSY10264
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) {
}
NSY10265
java/rmi + jconsole
• start rmiregistry 9999 l’annuaire
– Côté MBeanServer
NSY10266
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()); }}
NSY10267
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(); }
NSY10268
Souscription locale auprès du MBean distant
url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://163.173.228.92: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);
NSY10269
Notification, déjà vue
public void addNotificationListener
(ObjectName, NotificationListener, NotificationFilter, handback)
public void removeNotificationListener
(ObjectName name, NotificationListener listener)
Voir NotificationEmitter
NSY10270
Les adaptateurs
• Navigateur html adaptateur
NSY10271
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.*; // 5.0.1 jdmkrt.jar
NSY10272
Le Client est un navigateur
NSY10273
Client, navigateur
• Sans oublier, jdmkrt.jar dans le classpath– Bluej voir le répertoire lib/userlib/ ou ./+libs/– java -cp .;../JMX/jdmkrt.jar ThreadAgent
NSY10274
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
NSY10275
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)"
NSY10276
Chargement dynamique de MBean
• Agent M-Let
• Description XML
NSY10277
M-Let
• Comment – M-Let agent
NSY10278
Chargement dynamique de MBean
• M-Let
– « URLClassLoader »
Associé à un descripteur en XML
<MLET CODE=Sensor ARCHIVE=sensor.jar CODEBASE=http://jfod.cnam.fr/NSY102/jmx/ NAME=Sensor:name=Sensor1>
</MLET>
• Descripteur XML, nommé sensor.mlet, à cette URL http://jfod.cnam.fr/NSY102/jmx/sensor.mlet
NSY10279
Mlet en séquence
NSY10280
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();
}
}
NSY10281
Agent M-Let
• Téléchargement dynamique du MBean Sensor– Appel de getMBeansFromURL("http://jfod.cnam.fr/NSY102/jmx/sensor.mlet")
SensorÀ la volée!
NSY10282
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); }
NSY10283
M-Let File
<MLET CODE="className" | OBJECT="serializedObjectFileName" ARCHIVE="classOrJarFileName" [CODEBASE="relativePathToArchive"] [NAME="mbeanObjectName"] [VERSION="version"] > [<ARG TYPE="type" VALUE="value">]
</MLET>
• [<ARG TYPE="type" VALUE="value">]– Adaptés au constructeurs avec paramètres– Exemple <ARG TYPE=int VALUE=3000>
NSY10284
Retrait dynamique de MBean
• mbs = ManagementFactory.getPlatformMBeanServer();
• ObjectName name=…• mbs.unregister(name)
– À faire avec jconsole …
NSY10285
Sommaire
NSY10286
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)
NSY10287
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
( Ce sera NotificationBroadcaster.getNotificationInfo() qui sera déclenchée)
NSY10288
MBeanInfo et plus …
NSY10289
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
NSY10290
JConsole et Applet
Extrait de http://blogs.sun.com/lmalventosa/
Développer1. une interface AppletteXXXXXMBean2. une classe AppletteXXXXX extends JApplet implements AppletteXXXXXMBean3. Puis générer l’archive AppletteXXXXX.jar
Générer un certificatkeytool -genkey -alias nsy -keypass PWD -keystore nsystore -storepass PWD
Signer l’archivejarsigner -keystore nsystore AppletteXXXXX.jar nsy
Exemple : ici http://jfod.cnam.fr/NSY102/AppletteServeurWeb.htmlC’est une page html standard
<applet code="AppletteServeurWeb.class" width=500 height=200 archive="AppletteServeurWeb.jar" >
NSY10291
JConsole et Applet démo
Un client : http://localhost:8100/test/?param1=applette
NSY10292
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 http://localhost:8100/test/?test=essai
NSY10293
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– …
NSY10294
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();
}
NSY10295
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 http://jfod.cnam.fr/NSY102/appletteServeurWebMBean/
NSY10296
Conclusion
• JMX est bien un framework/canevas
– MBean– Plug-in
Plug-in et JMXinstaller pour voir celui-ci :http://blog.luminis.nl/luminis/entry/top_threads_plugin_for_jconsole voir également
http://blogs.sun.com/jmxetc/entry/ingo_rockel_thread_dump_plugin
jconsole et jvisualVM deux utiles outils de supervision, et simples d’utilisation
NSY10297
jconsole
• Les sources de sun : https://jdk6.dev.java.net/
• sun/tools/jconsole/ • sun/tools/jconsole/inspector/ • sun/tools/jconsole/resources/ • com/sun/tools/jconsole/ •
NSY10298
Luis-Miguel Alventosa’s Blog
• http://blogs.sun.com/lmalventosa/
• Luis-Miguel Alventosa show how to use JMX Monitoring & Management with both Applets and Web Start Applications. [July 6, 2006]
– http://blogs.sun.com/lmalventosa/entry/per_thread_cpu_usage_jconsole
• Voir aussi jconsole -pluginpath topthreads.jar – http://blog.luminis.nl/luminis/entry/top_threads_plugin_for_jconsole
NSY10299
http://blog.luminis.nl/luminis/entry/top_threads_plugin_for_jconsole
• jconsole -pluginpath topthreads.jar – Onglet Top threads
NSY102100
MBean Cycle de vie
• Extrait de ce livre, – chapitre 9 : Designing with JMX
• Paragraphe 3 MBean Registration and Lifecycle
NSY102101
Création locale et enregistrement
NSY102102
Création du MBean et enregistrement
NSY102103
Création depuis une application externe
NSY102104
Création par un adaptateur
NSY102105
Création au démarrage
NSY102106
M-let et notifications
• Être prévenu d’un téléchargement
• Voir l’adaptateur livre page 241
NSY102107
MXBean JMX 1.4 et les annotations
L’exemple de sun http://java.sun.com/javase/6/docs/technotes/guides/jmx/tutorial/essential.html#wp1054551
public interface QueueSamplerMXBean { public QueueSample getQueueSample(); public void clearQueue(); }
public class QueueSampler implements QueueSamplerMXBean { private Queue<String> queue; public QueueSampler(Queue<String> 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(); } } }
NSY102108
MXBean 1.4
public class QueueSample {
private final Date date; private final int size;
private final String head;
@ConstructorProperties({"date", "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; }
}
NSY102109
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();
NSY102110
JMX-JBoss
• http://www.openknowledge.de/pdf/jax2003/JMX_2003_05_10.pdf
NSY102111
Sécurisé les accès
• Extrait de http://blogs.sun.com/jmxnetbeans/date/20070816• http://jfod.cnam.fr/NSY102/jmx/TestSSLContext.java
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();
NSY102112
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=123456 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();
NSY102113
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){} } }
}