SlideShare una empresa de Scribd logo
1 de 129
Descargar para leer sin conexión
Supervision avec JMX
antislashn.org JBoss - Supervision avec JMX 2 / 125
JMX
● JMX : Java Management eXtension
● Standard pour la gestion et la supervision des
ressources
● inclus de Java SE depuis la version 5
● supervision des ressources matérielles et logicielles
● Standard utilisé massivement dans le monde des
serveurs Java EE
● JBoss est composé d'un serveur JMX dans lequel
viennent s'agréger les différents services
antislashn.org JBoss - Supervision avec JMX 3 / 125
JMX
● Le standard impose de respecter
● une architecture
● une configuration de classes
– avec un système de nommage
– le contrôle est effectué par des modules applicatifs appelés
MBean (Managed Bean)
● Architecture en trois couches
● niveau clients : permet le contrôle
● niveau agent : serveur
● niveau instrumentation : les MBeans
antislashn.org JBoss - Supervision avec JMX 4 / 125
JMX
source : Oracle
antislashn.org JBoss - Supervision avec JMX 5 / 125
JMX
niveau clients
Services :
●Timers
●Notification
Connecteurs et adaptateurs
Serveur de MBean
niveau agent JMX
niveau instrumentation MBean
MBean
MBean
Client JMX
antislashn.org JBoss - Supervision avec JMX 6 / 125
Niveau instrumentation
● Une ressource administrable doit tourner dans
une JVM
● application, service, périphérique
● L'instrumentation de la ressource est effectuée par
les MBeans
● l'écriture d'un MBean doit suivre un modèle de
conception
● une ressource instrumentée par un MBean est
administrable par l'agent JMX
antislashn.org JBoss - Supervision avec JMX 7 / 125
Niveau instrumentation
● Plusieurs types de MBeans
● Standard MBean
– les fonctionnalités sont exposées statiquement par interface
● MXBean
– Standard MBean possédant des contraintes sur les types
● Dynamic MBean
– les fonctionnalités sont exposée dynamiquement
● Model MBean
– MBean générique et configurable
● Open MBean
– Dynamic MBean possédant des contraintes sur les types
antislashn.org JBoss - Supervision avec JMX 8 / 125
Niveau agent
Serveur de
MBeans
MBean
Registry
MBean
meta data
Client
MBean
MBean
antislashn.org JBoss - Supervision avec JMX 9 / 125
Niveau agent
● L'agent JMX (ou serveur JMX) est composé de
● du serveur de MBean
– classe MBeanServer
● de services
– service de notifications : classe Notification
– service de timer : classe Timer
● des connecteurs et adaptateurs de protocoles pour
dialoguer avec la couche client
– connecteur : permet à un client Java de se connecter au serveur –
utilise RMI
– adaptateurs de protocoles : permet au client d'utiliser d'autres
protocoles que RMI
antislashn.org JBoss - Supervision avec JMX 10 / 125
Niveau agent
● Le serveur de MBean joue le rôle de registre
d'objets
● un MBean doit s'enregistrer avec un nom unique
auprès du serveur
– le nom est de type ObjectName
● composé d'un domaine et de propriétés (séparateurs : et ,)
– l'enregistrement peut être effectué par
● l'agent lui-même
● un autre MBean
● une application distante via un service distribué
jboss.deployment:flavor=URL,type=DeploymentScanner
antislashn.org JBoss - Supervision avec JMX 11 / 125
Niveau agent
● Une fois enregistré, un certain nombres
d'opérations sont disponibles sur le MBean
● découverte des opérations disponibles sur le MBean
● lecture et écriture des attributs
● invocation des opérations du MBean
● récupération des notifications émises par le MBean
antislashn.org JBoss - Supervision avec JMX 12 / 125
Niveau agent
● Les services d'agent
● sont généralement eux-mêmes des MBeans
● gèrent les opération de gestion des MBeans
● par défaut :
– service m-let (Management Applet)
● gestion du chargement dynamique des classes
– service moniteur
● gestion des notification
– service de timers
● déclenchements réguliers d'action sur les MBeans
– service de mise en relation des MBeans entre eux
antislashn.org JBoss - Supervision avec JMX 13 / 125
Niveau client
● Client du niveau agent
● Ce niveau fournit une interface de supervision et
administration
● Deux outils sont fournis par le JDK
● jconsole
● jvisualvm
– regroupe plusieurs outils
– la visualisation des MBeans nécessite le chargement d'un
plugin
● Possibilité de créer son propre client
antislashn.org JBoss - Supervision avec JMX 14 / 125
JMX
● Le MBean suit un modèle de conception
● il comporte
– des attributs en lecture / écriture
● spécification des getteur/setteur
– des opérations
– et éventuellement une description
antislashn.org JBoss - Supervision avec JMX 15 / 125
Standard MBean
● Modèle de conception
● spécification de nommage entre l'interface qui expose
les attributs et opération et la classe d'implémentation
● la classe d'implémentation doit posséder un
constructeur par défaut
● les attributs sont spécifiés par les méthodes
getXxx(), setXxx() et isXxx()
antislashn.org JBoss - Supervision avec JMX 16 / 125
Standard MBean
● Codage simple
● une interface
– même nom que la classe d'implémentation suffixé par
MBean
– les getteur/setteur indique si
l'attribut est en lecture et/ou
écriture
● une classe d'implémentation
antislashn.org JBoss - Supervision avec JMX 17 / 125
Standard MBean : couche agent
● Le MBean est identifié dans le serveur par son
nom
● ou ObjectName
● composé de deux parties
– le domaine
– les propriétés
– les deux sont séparés par le caractère :
jboss.deployment:flavor=URL,type=DeploymentScanner
antislashn.org JBoss - Supervision avec JMX 18 / 125
Standard MBean : couche agent
● Étapes principales
● récupération d'un serveur de MBeans
● création d'un ObjectName pour l'enregistrement du
MBean
● enregistrement du MBean auprès du serveur
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName mBeanName = new ObjectName("antislashn.jmx:bean=Hello,type=standard");
HelloMBean mBean = new Hello();
mbs.registerMBean(mBean, mBeanName);
antislashn.org JBoss - Supervision avec JMX 19 / 125
Standard MBean : couche agent
● Pour exécuter le serveur de MBean, il faut activer
l'accès distant à JMX
● -Dcom.sun.management.jmxremote
● d'autres propriétés peuvent être précisées si en mode
remote
● un modèle de fichier de mot de passe est proposé
dans le répertoire lib/management du JRE
java -Dcom.sun.management.jmxremote.port=3333
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
MonAppliJava
antislashn.org JBoss - Supervision avec JMX 20 / 125
Standard MBean : supervision
● Des utilitaires de supervisions sont livrés avec le
JDK
● jconsole
● jvisualvm
– qui intègre les utilitaire jconsole, jstat , jinfo, jmap
antislashn.org JBoss - Supervision avec JMX 21 / 125
Standard MBean : supervision
● Exemple de copie d'écran avec jvisualvm
antislashn.org JBoss - Supervision avec JMX 22 / 125
StandardMBean : codage d'un client
● Pour que le client se connecte au serveur de
MBean, il faut que celui ci soit lancé avec les
arguments suivants
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=3333
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
antislashn.org JBoss - Supervision avec JMX 23 / 125
StandardMBean : codage d'un client
● Les étapes de codage
● créer une URL
● récupérer un connecteur
● récupérer une connexion
● récupérer un proxy vers le MBean
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
ObjectName objectName = new ObjectName("antislashn.jmx:bean=Hello,type=standard");
HelloMBean mBean = JMX.newMBeanProxy(serverConnection, objectName, HelloMBean.class);
System.out.println(">>> "+mBean.getName());
le client connaît la classe du MBean
port passé en argument à la JVM du server
antislashn.org JBoss - Supervision avec JMX 24 / 125
Dynamic MBean
● Implémente l'interface DynamicMBean
● la lecture des attributs et opérations disponibles ne se
fait plus par introspection
– utilisation des méthodes redéfinies
● bien que plus complexe à coder, ce type de bean est
plus puissant
– exposition des attributs et opérations à l'exécution
● pour le Standard MBean l'exposition est effectuée à la compilation
– pas d'import de classes spécifique côté client
antislashn.org JBoss - Supervision avec JMX 25 / 125
Dynamic MBean
● Les méthodes de DynamicMean permettent
● de découvrir les attributs et opérations du MBean
– getMBeanInfo()
● de retrouver la valeur d'un attribut, ou d'une liste d'attributs
– Object getAtribute(String attribute)
– AttributeList getAttributes(String[] attributes)
● mettre à jour la valeur d'un attribut, ou d'une liste d'attributs
– void setAttribute(Attribute attribute)
– AttributeList setAttributes(AttributeList attributes)
● d'invoquer une opération
– Object invoke(String action,Object[] params, Object[] types)
antislashn.org JBoss - Supervision avec JMX 26 / 125
Dynamic MBean
● Méta-classes de description
● MBeanInfo : une instance par Dynamic MBean
– conteneur de méta données
● MBeanAttributeInfo : une instance par attribut
● MBeanParameterInfo : une instance par paramètre
● MBeanConstructorInfo : une instance par
constructeur
– contient un ou plusieurs MBeanParameterInfo
● MBeanOperationInfo : une instance par opération
– contient un ou plusieurs MBeanParameterInfo
● MBeanNotificationInfo : une instance par groupe de
notifications
antislashn.org JBoss - Supervision avec JMX 27 / 125
Dynamic MBean
● MBeanAttributeInfo
● description d'un attribut
– name : nom de l'attribut tel qu'il apparaît dans l'interface de
gestion
– type : classe de l'attribut sous forme d'un String
●
Integer.TYPE.getName() ou Hello.class.getName() par exemple
– description : description de l'attribut
– isReadable : indicateur de lecture
– isWritable : indicateur d'écriture
– isis : indicateur d'attribut de type booléen
● l'accesseur débute alors par is au lieu de get
antislashn.org JBoss - Supervision avec JMX 28 / 125
Dynamic MBean
● MBeanParameterInfo
● description d'un paramètre de constructeur ou
d'opération
– name : nom du paramètre tel qu'il apparaît dans l'interface
de gestion
– type : classe du paramètre sous forme d'un String
– description : description du paramètre
antislashn.org JBoss - Supervision avec JMX 29 / 125
Dynamic MBean
● MBeanConstructorInfo
● description d'un constructeur
– name : nom du constructeur tel qu'il apparaît dans l'interface
de gestion
– description : description du paramètre
– signature : tableau de MBeanParameterInfo
correspondant à la signature du constructeur
antislashn.org JBoss - Supervision avec JMX 30 / 125
Dynamic MBean
● MBeanOperationInfo
● description d'une opération
– name : nom de l'opération telle qu'elle apparaît dans
l'interface de gestion
– description : description du paramètre
– signature : tableau de MBeanParameterInfo
correspondant à la signature du constructeur
– type : type du retour
– impact : indicateur d'impact sur l'état du bean
antislashn.org JBoss - Supervision avec JMX 31 / 125
Dynamic MBean
● MBeanOperationInfo
● valeurs possibles pour la propriété impact
– INFO : état du MBean inchangé, l'opération retourne une
information
– ACTION : l'état du MBean a changé
– ACTION_INFO : l'état du MBean a changé, et l'opération
retourne une information
– UNKNOW : l'impact de l'opération sur l'état du MBean est
inconnu
antislashn.org JBoss - Supervision avec JMX 32 / 125
Dynamic MBean
● MBeanNotificationInfo
● description d'une notification
– name : nom de la notification telle qu'elle apparaît dans
l'interface de gestion
– description : description du paramètre
– notifsType : types des notifications qui sont émises par le
MBean sous forme d'un tableau de String
● un type de notification est du type :
vendor[.application][.component][.eventGroup].event
antislashn.org JBoss - Supervision avec JMX 33 / 125
Dynamic MBean
● MBeanInfo
● description d'un MBean
– className : nom de la classe du MBean (String)
– description : description du paramètre
– attributes : tableau des MBeanAttributeInfo
– constructors : tableau des MBeanConstructorInfo
– operations : tableau des MBeanOperationInfo
– notifications : tableau des MBeanNotificationInfo
antislashn.org JBoss - Supervision avec JMX 34 / 125
Dynamic MBean
● Codage du MBean
● l'exemple reprends
du Standard MBean Hello
public interface HelloMBean {
// attributs
String getName();
String getColor();
void setColor(String
color);
// opérations
void sayHello();
double add(double a, double
b);
}
public class Hello implements HelloMBean {
private String name ="Toto MBean";
private String color = "vert";
@Override
public String getName() {
return name;
}
@Override
public String getColor() {
return color;
}
@Override
public void setColor(String color) {
this.color = color;
}
@Override
public void sayHello() {
System.out.println(">>> Standard MBean "+name+" - "+color);
}
@Override
public double add(double a, double b) {
return a+b;
}
}
antislashn.org JBoss - Supervision avec JMX 35 / 125
Dynamic MBean - codage
● Déclaration des attributs
● constructeur de la classe MBeanAttributeInfo :
● code (extrait)
MBeanAttributeInfo[] attributeInfos = new MBeanAttributeInfo[2];
attributeInfos[0] = new MBeanAttributeInfo("Name",String.class.getName(),
"Nom du MBean",false,true,false);
attributeInfos[1] = new MBeanAttributeInfo("Color", String.class.getName(),
"Couleur du MBean", true, true, false);
MBeanAttributeInfo(String name, String type,
String description,
boolean isReadable,
boolean isWritable,
boolean isIs)
antislashn.org JBoss - Supervision avec JMX 36 / 125
Dynamic MBean - codage
● Déclaration des opérations
● constructeur de la classe MBeanOperationInfo :
● code (extrait)
MBeanOperationInfo[] operationInfos = new MBeanOperationInfo[5];
MBeanParameterInfo[] parameterInfos = new MBeanParameterInfo[2];
parameterInfos[0] = new MBeanParameterInfo("a", Double.TYPE.getName(), "Paramètre a");
parameterInfos[1] = new MBeanParameterInfo("a", Double.TYPE.getName(), "Paramètre a");
operationInfos[0] = new MBeanOperationInfo("add", "addition de deux double", parameterInfos,
Double.TYPE.getName(), MBeanOperationInfo.UNKNOWN);
MBeanOperationInfo(String name, Method method)
antislashn.org JBoss - Supervision avec JMX 37 / 125
Dynamic MBean - codage
● Méthode getAttribute(...)
public Object getAttribute(String attributeName)
throws AttributeNotFoundException, MBeanException, ReflectionException {
if(attributeName.equals("Color")){
return this.color;
}
else if(attributeName.equals("Name")){
return this.name;
}
else
throw new AttributeNotFoundException("Can't find "+attributeName);
}
antislashn.org JBoss - Supervision avec JMX 38 / 125
Dynamic MBean - codage
● Méthode getAttributes(...)
● retour de type AttributeList
– étend ArrayList, mais sans généricité sur Attribute
– contient des instances de type Attribute
● encapsule les nom et valeur d'un attribut
public AttributeList getAttributes(String[] attributeNames) {
AttributeList list = new AttributeList();
for(String name : attributeNames){
try {
Object value = this.getAttribute(name);
list.add(new Attribute(name, value));
} catch (AttributeNotFoundException | MBeanException | ReflectionException e) {
e.printStackTrace();
}
}
return list;
}
antislashn.org JBoss - Supervision avec JMX 39 / 125
Dynamic MBean - codage
● Méthode setAttribute(...)
public void setAttribute(Attribute attribute)
throws AttributeNotFoundException, InvalidAttributeValueException,
MBeanException, ReflectionException {
String name = attribute.getName();
Object value = attribute.getValue();
if(name.equals("Color") && (value instanceof String)){
this.setColor((String) value);
} else {
new AttributeNotFoundException("Attribut "+name+" inconnu ou en lecture seule");
}
}
antislashn.org JBoss - Supervision avec JMX 40 / 125
Dynamic MBean - codage
● Méthode setAttributes(...)
public AttributeList setAttributes(AttributeList attributes) {
AttributeList list = new AttributeList();
for(int i=0 ; i<attributes.size() ; i++){
try{
Attribute attribute = (Attribute) attributes.get(i);
this.setAttribute(attribute);
String name = attribute.getName();
Object value = attribute.getValue();
list.add(new Attribute(name, value));
} catch(Exception e){
e.printStackTrace();
}
}
return list;
}
antislashn.org JBoss - Supervision avec JMX 41 / 125
Dynamic MBean - codage
● Méthode invoke(...)
● est invoquée pour chaque opération
– pas pour les accesseurs/mutateurs des attributs
● il faut vérifier que le nom de la méthode et la signature
soient adéquats
– sinon il faut lever une ReflectionException
● il faut aussi vérifier le tableau des paramètres
– les types des paramètres correspondent-ils à la signature
antislashn.org JBoss - Supervision avec JMX 42 / 125
Dynamic MBean - codage
● Méthode invoke(...)
public Object invoke(String operationName, Object[] params, String[] signature)
throws MBeanException, ReflectionException {
Object retour = null;
if(operationName.equals("sayHello")){
this.sayHello();
retour = Void.TYPE;
}
else if(operationName.equals("add")){
if(signature[0].equals(Double.TYPE.getName()) &&
signature[1].equals(Double.TYPE.getName())){
if(params[0] instanceof Double && params[1] instanceof Double){
double a = ((Double)params[0]).doubleValue();
double b = ((Double)params[1]).doubleValue();
retour = new Double(a+b);
}
}
} else
new ReflectionException(new NoSuchMethodException("Unknow operation : "+operationName));
return retour;
}
antislashn.org JBoss - Supervision avec JMX 43 / 125
Dynamic MBean
● Plus complexe à coder, mais...
● les opérations et attributs peuvent évoluer durant le
cycle de vie du bean
– les méthodes de description du MBean sont appelées tout
au long de l'utilisation du MBean
– pour un Standard MBean, l'exposition des attributs et des
méthodes passe par une interface
antislashn.org JBoss - Supervision avec JMX 44 / 125
Dynamic MBean : codage d'un client
● Étapes de codage
● construction de l'URL
● récupération d'un connecteur
● récupération d'une connexion au serveur JMX
● utilisation de la connexion au serveur pour
– récupérer les méta-données du MBean
– utiliser les attributs
– invoquer les opérations
antislashn.org JBoss - Supervision avec JMX 45 / 125
Dynamic MBean : coadeg d'un client
● Exemple de code
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
ObjectName objectName = new ObjectName("antislashn.jmx:bean=Hello,type=dynamic");
MBeanInfo beanInfo = serverConnection.getMBeanInfo(objectName);
MBeanAttributeInfo[] attributeInfos = beanInfo.getAttributes();
MBeanOperationInfo[] operationInfos = beanInfo.getOperations();
for(MBeanAttributeInfo att : attributeInfos){
System.out.println(">>> Attribut : "+att.getName()+" == "+
serverConnection.getAttribute(objectName, att.getName()));
}
for(MBeanOperationInfo op : operationInfos){
System.out.println(">>> Opération : "+op.getName());
if(op.getName().equals("sayHello"))
System.out.println("=> sayHello() returns "+
serverConnection.invoke(objectName, op.getName(),
new Object[0], new String[0]));
}
le client ne connaît pas la classe du MBean
antislashn.org JBoss - Supervision avec JMX 46 / 125
Model MBean
● Type de MBean dynamique
● n'implémente aucune interface
● Le MBean n'a pas besoin de détenir une référence
vers la ressource à gérer
● Utilise la classe RequiredModelBean pour
associer une description de MBean à la ressource
à superviser
antislashn.org JBoss - Supervision avec JMX 47 / 125
Model MBean
● Pour résoudre l'interface du Model MBean, on
utilise une classe de méta-données
● Descriptor
– interface implémentée par DescriptionSupport
– collection de paires nom/valeur (String/Object)
● une paire représente un attribut, un constructeur, une opération ou
une notification
● il y a un descripteur par type de champ
● le descripteur décrit complètement le champ par la paire nom/valeur
– les noms utilisés sont liés à la spécification
antislashn.org JBoss - Supervision avec JMX 48 / 125
Model MBean
● Interface Descriptor
● permet la résolution des champs
– les noms de champs sont spécifiés par JMX
– des noms personnalisés peuevent être ajoutés
● méthodes
– Object getFieldValue(String fieldName)
– void setField(String fieldName, Object fieldValue)
– String[] getFields()
– String[] getFieldNames()
– void removeField(String fieldName)
– void setFields(String[] fieldNames,
Object[] fieldValues)
antislashn.org JBoss - Supervision avec JMX 49 / 125
Model MBean
● Champs utilisés par la spécification
● name (obligatoire) : nom utilisé par le champ
● descriptorType (obligatoire) : description du type de
champ, valeurs possibles
– MBean, attribute, operation, notification
● displayName : nom utilisé pour l'affichage dans le client
● getMethod : nom du getteur si le type est un attribut
– doit être déclaré dans les opérations
● setMethod : nom du setteur si le type est un attribut
– doit être déclaré dans les opérations
antislashn.org JBoss - Supervision avec JMX 50 / 125
Model MBean
● Champs utilisés par la spécification
● currencyTimeLimit : utilisé sur les attributs
(getteur) et retour d'opérations pour estimer sa validité
– une marque lastUpdateTimeStamp est déposée sur
chaque valeur retournée
– unité : ms
● log : sur les notification, indicateur booléen
● logFile : obligatoire si log est utilisé, contient le
chemin d'un fichier de log
antislashn.org JBoss - Supervision avec JMX 51 / 125
Model MBean
● Champs utilisés par la spécification
● default : valeur par défaut d'un attribut
– utilise le setteur
● export : indicateur booléen utilisé pour la distribution
du MBean dans un environnement distribué
● role: utilisé sur les opération, sa valeur peut être
– operation, constructor, getter, setter
● persistPeriod : période de persistance en s, si
une persitPolicy a été déclarée avec la valeur
NoMoreOftenThan ou OnTimer
antislashn.org JBoss - Supervision avec JMX 52 / 125
Model MBean
● Champs utilisés par la spécification
● persistPolicy : stratégie de persistance, valeurs
possibles
– Never, OnTimer, OnUpdate, NoMoreOftenThan
● severity : degrès de sévérité d'une notification
– 0 : indéterminé
– et de 1 (NonRecoverable) à 6 (informative)
● value : utilisé comme cache sur les valeur d'attribut
en conjonction avec le champ currencyTimeLimit
antislashn.org JBoss - Supervision avec JMX 53 / 125
Model MBean
● Codage d'un descripteur
● Le descripteur peut être une chaîne XML
● Peut aussi être un tableau de String, String + Object
Descriptor attrDescriptor = new DescriptorSupport();
attrDescriptor.setField("name", "Name");
attrDescriptor.setField("descriptorType", "attribute");
attrDescriptor.setField("displayName", "Nom du Model MBean");
attrDescriptor.setField("getMethod", "getName");
<descriptor>
<field name="name" value="Name" />
<field name="descriptorType" value="attribute"/>
<field name="displayName" value="Nom du Model MBean"/>
<field name="getMethod" value="getName"/>
</descriptor>
Descriptor attrDescriptor = new DescriptorSupport(descriptorXML) ;
antislashn.org JBoss - Supervision avec JMX 54 / 125
Model MBean
● Description de l'interface du MBean
● comme pour le Dynamic MBean il y a un ensemble de
classes pour les méta-données
– ModelMBeanAttributeInfo : une instance par attribut
– ModelMBeanConstructorInfo : une instance par
constructeur
– ModelMBeanOperationInfo : une instance par opération
– ModelMBeanNotificationInfo : une instance par
groupe de notifications
– ModelMBeanInfoSupport : une instance pour le MBean
● conteneur des méta-données
antislashn.org JBoss - Supervision avec JMX 55 / 125
Model MBean
● Constructeurs des classes méta-données
● sauf pour ModelMBeanInfo
● plusieurs constructeurs
– cf. documentation
– certains ne prennent pas d'instance de Descriptor
● il y a alors création d'une instance de Descriptor par défaut, avec
les champs nécessaires
– l'utilisation d'un Descriptor permet d'ajouter les champs
non prévus par les constructeurs
antislashn.org JBoss - Supervision avec JMX 56 / 125
Model MBean
● Méta-données pour les attributs
attributeInfos = new ModelMBeanAttributeInfo[2];
Descriptor nameDescriptor = new DescriptorSupport();
nameDescriptor.setField("name", "Name");
nameDescriptor.setField("descriptorType", "attribute");
nameDescriptor.setField("displayName", "Nom du ModelMBean Hello");
nameDescriptor.setField("getMethod", "getName");
Descriptor colorDescriptor = new DescriptorSupport();
colorDescriptor.setField("name", "Color");
colorDescriptor.setField("descriptorType", "attribute");
colorDescriptor.setField("displayName", "Couleur ModelMBean Hello");
colorDescriptor.setField("currencyTimeLimit", -1);
colorDescriptor.setField("getMethod", "getColor");
colorDescriptor.setField("setMethod", "setColor");
attributeInfos[0] = new ModelMBeanAttributeInfo("Name", String.class.getName(),
"Nom du Model MBean", true, false,false, nameDescriptor);
attributeInfos[1] = new ModelMBeanAttributeInfo("Color",String.class.getName(),
"Couleur du Model MBean", true,true,false,colorDescriptor);
antislashn.org JBoss - Supervision avec JMX 57 / 125
Model MBean
● Méta-données pour les opérations
operationInfos = new ModelMBeanOperationInfo[5];
MBeanParameterInfo a = new MBeanParameterInfo("a", Integer.TYPE.getName(),
"Premier paramètre de l'addition");
MBeanParameterInfo b = new MBeanParameterInfo("b", Integer.TYPE.getName(),
"Second paramètre de l'addition");
MBeanParameterInfo color = new MBeanParameterInfo("colorr", String.class.getName(),
"Couleur du bean");
operationInfos[0] = new ModelMBeanOperationInfo("add","Addition entre deux entiers",
new MBeanParameterInfo[]{a,b},
Integer.TYPE.getName(),ModelMBeanOperationInfo.INFO);
operationInfos[1] = new ModelMBeanOperationInfo("sayHello","Juste un Hello, world",
null,
Void.TYPE.getName(),ModelMBeanOperationInfo.INFO);
operationInfos[2] = new ModelMBeanOperationInfo("getName","getName()",
null,
String.class.getName(),ModelMBeanOperationInfo.INFO);
operationInfos[3] = new ModelMBeanOperationInfo("getColor","getColor()",
null,
String.class.getName(),ModelMBeanOperationInfo.INFO);
operationInfos[4] = new ModelMBeanOperationInfo("setColor","setColor()",
new MBeanParameterInfo[]{color},
Void.TYPE.getName(),ModelMBeanOperationInfo.INFO);
antislashn.org JBoss - Supervision avec JMX 58 / 125
Model MBean
● Méta-données pour le Model MBean
● Association avec la ressource
mBeanInfo = new ModelMBeanInfoSupport("ModelMBeanHello", "Exemple de Model MBean",
attributeInfos,
null,
operationInfos,
null);
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName mBeanName = new ObjectName("antislashn.jmx:bean=Hello,type=model");
ModelMBeanHelloFactory factory = new ModelMBeanHelloFactory();
Hello hello = new Hello();
RequiredModelMBean mBean = new RequiredModelMBean(factory.getModelMBeanInfo());
mBean.setManagedResource(hello,"objectReference");
mbs.registerMBean(mBean, mBeanName);
antislashn.org JBoss - Supervision avec JMX 59 / 125
Model MBean
● Exemple de construction des méta-données
● extrait
Descriptor attrDescriptor = new DescriptorSupport();
attrDescriptor.setField("name", "Name");
attrDescriptor.setField("descriptorType", "attribute");
attrDescriptor.setField("displayName", "Nom du Model MBean");
attrDescriptor.setField("getMethod", "getName");
attributeInfos[0] = new ModelMBeanAttributeInfo("Name", String.class.getName(),
"Nom du Model MBean",
true, false,false, attrDescriptor);
attributeInfos[1] = new ModelMBeanAttributeInfo("Color",String.class.getName(),
"Couleur du Model MBean",
true,true,false);
mBeanInfo = new ModelMBeanInfoSupport("ModelMBeanHello", "Exemple de Model MBean",
attributeInfos, null, operationInfos, null);
ModelMBeanAttributeInfo(String name, String type, String description,
boolean isReadable, boolean isWritable, boolean
Descriptor descriptor)
antislashn.org JBoss - Supervision avec JMX 60 / 125
Model MBean
● Récupération du Descriptor
● auprès des classes de méta-données
● méthode Descriptor getDescriptor()
● il est ainsi possible de gérer le descripteur
– lister les champs
– ajouter des champs
– ...
antislashn.org JBoss - Supervision avec JMX 61 / 125
Model MBean
● Mise en relation de la ressource à gérer avec la
description du MBean
ObjectName mBeanName = new ObjectName("antislashn.jmx:bean=Hello,type=model");
ModelMBeanHelloFactory factory = new ModelMBeanHelloFactory();
Hello hello = new Hello();
RequiredModelMBean mBean = new RequiredModelMBean(factory.getModelMBeanInfo());
mBean.setManagedResource(hello,"ObjectReference");
mbs.registerMBean(mBean, mBeanName);
classe utilitaire construisant les descripteur
association du descripteur et de la ressource
antislashn.org JBoss - Supervision avec JMX 62 / 125
Model MBean
● Association entre la ressource et le descripteur de
MBean
● type de référence
– ObjectReference : seul supporté par défaut dans le JDK
– Handle
– IOR
– EJBHandle
– RMIReference
antislashn.org JBoss - Supervision avec JMX 63 / 125
Model MBean
● Résumé des étapes d'instrumentation d'une
ressource
● instancier la ressource à gérer
● instancier la classe RequiredModelBean
● créer les classes de méta-données nécessaires
● créer la méta-donnée pour la ressource
– ModelMBeanInfo
● ajouter à l'instance de RequiredModelBean la méta-
donnée de type ModelMBeanInfo
● associer la ressource
antislashn.org JBoss - Supervision avec JMX 64 / 125
MBean - comparaison
type
de
MBean
connaissance
du MBean par
le client
complexité
de
codage
utilisation
des
Open Type
Standard MBean oui simple non
Dynamic MBean non tout doit être codé non
Model MBean non implémentation par défaut fournie non
MXBean oui simple oui
Open MBean non complexe oui
● Les Model MBean et Dynamic MBean sont mis en
relation avec la ressource à surveiller
● ils ne possèdent pas de référence vers cette ressource
● ils n'encapsulent pas cette ressource
antislashn.org JBoss - Supervision avec JMX 65 / 125
Notification d'événements
● Le changement d'état d'une ressource peut-être notifiée
● par programmation
● par utilisation du service de monitoring
● La notification est une information envoyée par un
émetteur vers un listener via l'infrastructure JMX
● contient au minimum
– le type de la notification – String
● du type vendor[.application][.component][.eventGroup].event
– une référence vers l'émetteur
– un numéro de séquence qui identifie l'occurrence de la notification
antislashn.org JBoss - Supervision avec JMX 66 / 125
Notification d'événements
● Classes et interfaces principales
● classe Notification : représente une notification
– envoyée par un émetteur (broadcaster) vers un récepteur
(listener)
● interface NotificationFilter : permet au listener de
ne recevoir qu'une partie des notifications
– implémentée par NotificationFilterSupport
● interface NotificationBroadcaster : implémentée par tous
les émetteurs
– implémentée par NotificationBroadcastSupport
● interface NotificationListener : implémentée par
les récepteurs de notification
antislashn.org JBoss - Supervision avec JMX 67 / 125
Notification d'événements
● Un émetteur :
● implémente l'interface NotificationBroadcaster
– ou étend NotificationBroadcasterSupport
● fournir à l'infrastructure JMX les notifications susceptibles
d'être émises
– méthode MBeanNotificationInfo[] getNotificationInfo()
● Un récepteur étends l'interface
NotificationListener
● le listener peut recevoir un sous-ensemble des
notifications en fournissant une filtre
– le filtre implémente NotificationFilter
antislashn.org JBoss - Supervision avec JMX 68 / 125
Notification d'événements - exemple
● Une classe Compteur fait évoluer régulièrement
une valeur interne
● une notification sera émise à chaque changement de
cette valeur
● La classe Compteur
● implémente CompteurMBean
● étend NotificationBroadcastSupport
– redéfinition de la méthode getNotificationInfo()
● maintient un numéro de séquence de notification
● envoie une notification sur sa méthode setValue(...)
antislashn.org JBoss - Supervision avec JMX 69 / 125
Notification d'événements - exemple
● Redéfinition de la méthode getNotificationInfo()
...
@Override
public MBeanNotificationInfo[] getNotificationInfo(){
MBeanNotificationInfo[] infos = new MBeanNotificationInfo[1];
String[] types = new String[]{"antislashn.compteur.value"};
String name = AttributeChangeNotification.class.getName();
String description = "Un attribut de Compteur a changé";
MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);
infos[0] = info;
return infos;
}
...
antislashn.org JBoss - Supervision avec JMX 70 / 125
Notification d'événements - exemple
● Envoi de la notification
● la notification comporte au moins
– le type de notification – String
– une référence vers l'émetteur de la notification
– le numéro de séquence
● plusieurs constructeurs permettent d'ajouter
– un horodatage
– un message
– une référence vers un Object
● permet le passage d’informations supplémentaires entre l'émetteur et
le récepteur – méthode setUserData(Object userData)
antislashn.org JBoss - Supervision avec JMX 71 / 125
Notification d'événements - exemple
● Envoi de la notification
● Nota : la classe AttributeChangeNotification
aurait pu être utilisée
● permet d'ajouter des informations sur la valeur de
l'attribut
– ancienne valeur et nouvelle valeur
Notification notification = new Notification("antislashn.compteur.value",
this, sequenceNumber++);
sendNotification(notification);
antislashn.org JBoss - Supervision avec JMX 72 / 125
Notification d'événements - exemple
● Pour suivre les notification dans jconsole ou
jvisualvm, il faut d'abord souscrire
antislashn.org JBoss - Supervision avec JMX 73 / 125
Notification d'événements - exemple
● Et de voir les changements
antislashn.org JBoss - Supervision avec JMX 74 / 125
Notification d'événements - exemple
● L'implémentation de NotificationListener
permet de suivre les notifications avec son propre
client
● le client doit auparavant se connecter sur notre
serveur JMX
– via un adaptateur RMI
● l'url comporte le port d'écoute du serveur
– argument com.sun.management.jmxremote.port
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
antislashn.org JBoss - Supervision avec JMX 75 / 125
Notification d'événements - exemple
● Le client doit ensuite retrouver le MBean pour
s'enregistrer en tant que listener
ObjectName objectName = new ObjectName("antislashn.jmx:type=Compteur,subtype=Notification");
CompteurMBean compteurMBean = JMX.newMBeanProxy(serverConnection, objectName,
CompteurMBean.class, true);
serverConnection.addNotificationListener(objectName, new CompteurListener(), null, null);
le MBean peut
envoyer
des notifications
pas de
filtre
pas d'objet
handback
antislashn.org JBoss - Supervision avec JMX 76 / 125
Notification d'événements - exemple
● Le listener n'a qu'une méthode à implémenter
● handleNotification()
– premier paramètre : la notification
– seconde paramètre : l'objet handback
class CompteurListener implements NotificationListener{
@Override
public void handleNotification(Notification notification, Object handback) {
System.out.println(">>> Notification "+notification.getSource());
}
}
renvoie
l'OjectName du
MBeanc
antislashn.org JBoss - Supervision avec JMX 77 / 125
Notification d'événements - exemple
● Utilisation d'une donnée utilisateur
● les ancienne et nouvelle valeurs du compteur sont
encapsulées dans une classe
public class UserData implements Serializable{
private int oldValue;
private int newValue;
public UserData(int oldValue, int newValue) {
this.oldValue = oldValue;
this.newValue = newValue;
}
public int getOldValue() {
return oldValue;
}
public int getNewValue() {
return newValue;
}
}
antislashn.org JBoss - Supervision avec JMX 78 / 125
Notification d'événements - exemple
● Utilisation d'une donnée utilisateur
● mise en place de la donnée utilisateur côté MBean
●
●
●
● récupération dans le listener (côté client)
private void sendNotification() {
Notification notification = new Notification("antislashn.compteur.value",
this, sequenceNumber++);
UserData userData = new UserData(value-1, value);
notification.setUserData(userData);
sendNotification(notification);
}
class CompteurListener implements NotificationListener{
@Override
public void handleNotification(Notification notification, Object handback) {
System.out.println(">>> Notification "+notification.getSource());
if(notification.getUserData()!=null){
UserData userData = (UserData) notification.getUserData();
System.out.println("t oldValue == "+userData.getOldValue()+
" - newValue == "+userData.getNewValue());
}
}
}
antislashn.org JBoss - Supervision avec JMX 79 / 125
Notification d'événements - exemple
● Utilisation de l'objet de retour
● objet créé par le listener
● passé à l'émetteur de notification via la méthode
addNotificationListener()
● retourné à la méthode handleNotification() du
listener
● Permet de créer des contextes propres aux
listeners
antislashn.org JBoss - Supervision avec JMX 80 / 125
Notification d'événements - exemple
● Mise en place du handback
● lors de l'ajout du listener
● l'objet peut-être évidemment de tout type
● Récupération du handback
String typeLog = "email";
serverConnection.addNotificationListener(objectName, new CompteurListener(), null, typeLog);
class CompteurListener implements NotificationListener{
@Override
public void handleNotification(Notification notification, Object handback) {
String typeLog = (String) handback;
if(typeLog.equals("console")){
System.out.println(">>> Notification sur la console "+notification.getSource());
}else if(typeLog.equals("email")){
sendEmail();
}
}
}
antislashn.org JBoss - Supervision avec JMX 81 / 125
Notification d'événements - exemple
● Filtrer les notifications
● par implémentation de NotificationFilter
– encapsule la liste des types de notifications permis
– définit la méthode isNotificationEnabled() qui renvoie un
booléen indiquant la prise en charge ou non de l'envoi de la
notification au listener
● par utilisation de la classe
NotificationFilterSupport
– la méthode enableType() permet d'enregistrer les types de
notifications permis
● l'enregistrement du filtre est effectué lors de l'ajout du
listener
– méthode addNotificationListener(...)
antislashn.org JBoss - Supervision avec JMX 82 / 125
Notification d'événements - exemple
● Filtrer les notifications
● par implémentation de NotificationFilter
class CompteurNotificationFilter implements NotificationFilter {
String[] types = { "antislashn.counter.down" };
@Override
public boolean isNotificationEnabled(Notification notification) {
for (String type : types) {
if (type.equals(notification.getType()))
return true;
}
return false;
}
}
antislashn.org JBoss - Supervision avec JMX 83 / 125
Notification d'événements - exemple
● Filtrer les notifications
● par utilisation de NotificationFilterSupport
NotificationFilterSupport filter = new NotificationFilterSupport();
filter.enableType("antislashn.counter.down");
serverConnection.addNotificationListener(objectName, new CompteurListener(), filter, null);
antislashn.org JBoss - Supervision avec JMX 84 / 125
MXBean
● Le MXBean est un Standard MBean avec des
restrictions sur les types
● pas d'utilisation de types personnalisés
● utilisation de OpenType<T> et de ses types dérivés
● le client de MXBean n'a pas besoin de connaître la
classe métier utilisée
– le codage de la partie cliente est moins directe
● mais plus générique
● cf. http://docs.oracle.com/javase/7/docs/api/javax/management/MXBean.html
antislashn.org JBoss - Supervision avec JMX 85 / 125
MXBean
● Exemple de Standard MBean exposant une
classe métier Contact
● Utilisation par le client
public interface ContactServiceMBean {
void addContact(Contact contact);
List<Contact> getAllContacts();
Contact getContact(int id);
}
...
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
ObjectName objectName = new ObjectName("antislashn.jmx:type=ContactService");
ContactServiceMBean contactService = JMX.newMBeanProxy(serverConnection,
objectName, ContactServiceMBean.class);
Contact c1 = contactService.getContact(1);
...
La classe Contact est
importée
antislashn.org JBoss - Supervision avec JMX 86 / 125
MXBean
● Pour transformer le Standard MBean en XMBean,
il faut implémenter une interface postfixée par
MXBean au lieu de MBean
public interface ContactServiceMBean {
void addContact(Contact contact);
List<Contact> getAllContacts();
Contact getContact(int id);
}
public interface ContactServiceMXBean {
void addContact(Contact contact);
List<Contact> getAllContacts();
Contact getContact(int id);
}
antislashn.org JBoss - Supervision avec JMX 87 / 125
MXBean
● Le client ne récupère plus une classe métier mais
un CompositeType
● on interroge alors le CompositeType
– par le nom des propriétés du type métier
● les collections sont transformées en tableaux
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
ObjectName objectName = new ObjectName("antislashn.jmx:type=MXContactService");
CompositeData[] liste = (CompositeData[]) serverConnection.getAttribute(objectName, "AllContacts");
for(CompositeData data : liste){
String name = (String) data.get("name");
int age = (int) data.get("age");
System.out.println("Contact : "+name+ " - "+age);
}
interrogation de l'attribut AllContacts
du XMBean
récupération des propriétés de l'objet
métier par leur nom
antislashn.org JBoss - Supervision avec JMX 88 / 125
Services de monitoring
● Permet d'observer les valeurs des attributs d'un
MBean
● le MBean est l'objet observé
● le moniteur observe le MBean à intervalle régulier
– en ms (granularity period)
– une notification est envoyée lorsqu'une condition est
satisfaite
● la condition varie en fonction du type de moniteur
– le moniteur peut calculer une valeur par différence (derived
gauge)
● pour les attributs numériques
● non activé par défaut
– cf. méthode setDifferenceMode(boolean value)
antislashn.org JBoss - Supervision avec JMX 89 / 125
Services de monitoring
● Trois moniteurs de surveillance sont fournis par défaut dans
l'implémentation JMX
antislashn.org JBoss - Supervision avec JMX 90 / 125
Services de monitoring
● Surveillance de comptage
● CounterMonitor
● observe l'augmentation d'un attribut entier d'un MBean
– byte, short, int, long et classes associées
– envoie une notification si la valeur de l'attribut observé
dépasse une certaine valeur (threshold)
● possibilité de relancer la notification
– setOffset(Number value)
– mode de calcul par différence
● if (counter[t] - counter[t-GP]) is positive then V[t] = counter[t] - counter[t-GP]
● if (counter[t] - counter[t-GP]) is negative then V[t] = counter[t] - counter[t-GP] + MODULUS
– GP => garnularity period
antislashn.org JBoss - Supervision avec JMX 91 / 125
Services de monitoring
● Surveillance d'évolution
● GaugeMonitor
● observe un changement arbitraire d'un attribut
numérique d'un MBean
– int, long, float, double et classes associées
– envoie une notification si la valeur dérivée
● passe au-dessus d'une limite haute (high threshold)
● passe en-dessous d'une limite basse (low threshold)
antislashn.org JBoss - Supervision avec JMX 92 / 125
Services de monitoring
● Surveillance de chaîne de caractères
● StringMonitor
● observe un changement sur attribut de type String d'un
MBean
● envoie une notification lorsque la valeur dérivée
– est égale à une chaîne de caractère précise
– diffère d'une chaîne de caractère précise
antislashn.org JBoss - Supervision avec JMX 93 / 125
CounterMonitor - exemple
● Un MBean compteur change sa propre valeur sur un
thread
● attribut Value
● Un CounterMonitor surveille se MBean
● Mise en place de la surveillance
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName compteurObjectName = new ObjectName("antislashn.jmx:type=Compteur");
CompteurMBean compteurMBean = new Compteur();
server.registerMBean(compteurMBean, compteurObjectName);
ObjectName monitorObjectName = new ObjectName("antislashn.jmx:type=Monitor");
CounterMonitor monitor = new CounterMonitor();
monitor.addObservedObject(compteurObjectName);
monitor.setObservedAttribute("Value");
…
server.registerMBean(monitor, monitorObjectName);
enregistrement du MBean Compteur
enregistrement du CounterMonitor
objet et attribut observé
antislashn.org JBoss - Supervision avec JMX 94 / 125
CounterMonitor - exemple
● Signal généré par le CompteurMBean
● Stratégie mise en place
● période de surveillance : toute les secondes
● une notification est lancée si l'attribut est supérieur à 7
monitor.setGranularityPeriod(1000);
monitor.setInitThreshold(7);
monitor.setNotify(true);
0
100
10 s
antislashn.org JBoss - Supervision avec JMX 95 / 125
CounterMonitor - exemple
● Signal généré par le CompteurMBean
● Stratégie mise en place
● période de surveillance : toute les secondes
● une notification est lancée si la valeur de l'attribut
surveillé est supérieur à 7
monitor.setGranularityPeriod(1000);
monitor.setInitThreshold(7);
monitor.setNotify(true);
0
Integer.MAX_VALUE
incrément de 1 toutes les 100 ms
antislashn.org JBoss - Supervision avec JMX 96 / 125
CounterMonitor - exemple
● Signal généré par le CompteurMBean
● Stratégie mise en place
● période de surveillance : toute les secondes
● une notification est lancée si la valeur de l'attribut
surveillé est supérieur à 7
monitor.setGranularityPeriod(1000);
monitor.setInitThreshold(7);
monitor.setNotify(true);
0
Integer.MAX_VALUE
incrément de 1 toutes les 100 ms
antislashn.org JBoss - Supervision avec JMX 97 / 125
CounterMonitor - exemple
● Signal généré par le CompteurMBean
● Stratégie mise en place
● période de surveillance : toute les secondes
● une notification est lancée si l'attribut est supérieur à 7
● l'offset ajouté au threshold a chaque fois que la valeur
sous surveillance est supérieure au threshold
– permet de lancer plusieurs
notifications
monitor.setGranularityPeriod(1000);
monitor.setInitThreshold(7);
monitor.setOffset(5);
monitor.setNotify(true);
0
Integer.MAX_VALUE
incrément de 1 toutes les 100 ms
antislashn.org JBoss - Supervision avec JMX 98 / 125
GaugeMonitor - exemple
● Signal généré par le CompteurMBean
0
100
10 s
GaugeMonitor monitor = new GaugeMonitor();
monitor.addObservedObject(compteurObjectName);
monitor.setObservedAttribute("Value");
monitor.setGranularityPeriod(10);
monitor.setThresholds(7, 3);
monitor.setNotifyHigh(true);
monitor.setNotifyLow(true);
antislashn.org JBoss - Supervision avec JMX 99 / 125
Timer Service
● Émetteur de notifications programmable
● intervalle fixe
● date donnée
● etc.
● Structure du service
● le service émet des TimerNotification
antislashn.org JBoss - Supervision avec JMX 100 / 125
Timer Service
● Classe Timer
● utilise un thread secondaire
● méthode addNotification(...)
– ajoute une notification à la file des notifications à envoyer
– plusieurs signatures
● envoi d'une notification
● envoi période de notification
● envoi d'un nombre prédéfini de notification
antislashn.org JBoss - Supervision avec JMX 101 / 125
Timer Service
● Utilisation du timer
● création d'une instance de Timer
● ajout d'une notification
● ajout d'un listener
● démarrage du timer
Timer mBean = new Timer();
Date date = new Date(new Date().getTime()+Timer.ONE_SECOND*2);
mBean.addNotification("antislashn.timer.test", "test 1", null, date);
mBean.addNotification("antislashn.timer.test", "test 2", null, date,1000,10);
mBean.addNotificationListener(new TimerNotificationListener(), null, null);
mBean.start();
une notification sera
envoyée à la date
programmée
10 notifications seront envoyées, toutes
les secondes, à partir de la date
programmée
antislashn.org JBoss - Supervision avec JMX 102 / 125
Monitoring de la JVM
● Plusieurs fonctionnalités ont été ajoutées depuis
le JDK 1.5
● la JVM est instrumentée avec des MBean
● existence d'une API de monitoring
– permet d'obtenir des informations sur l'état de la JVM durant
son exécution
● mémoire, threads, garbage collector, …
– utilisable sous forme de MBean de type MXBean
● chaque MBean est identifié par son ObjectName
● ils implémentent l'interface PlatformManagedObject
● des méthodes la classe ManagementFactory permettent de
récupérer directement les MXBeans
antislashn.org JBoss - Supervision avec JMX 103 / 125
Monitoring de la JVM
● Exemple sur OperatingSystemMXBean
OperatingSystemMXBean mxBean = ManagementFactory.getOperatingSystemMXBean();
System.out.println("Architecture : "+mxBean.getArch());
System.out.println("Nb de processeurs : "+mxBean.getAvailableProcessors());
System.out.println("Système d'exploitation : "+mxBean.getName()+" "+mxBean.getVersion());
System.out.println("Charge du système : "+mxBean.getSystemLoadAverage());
Architecture : x86
Nb de processeurs : 8
Systeème d'exploitation : Windows 7 6.1
Charge du système : -1.0
la charge n'a pas pu être
calculée
antislashn.org JBoss - Supervision avec JMX 104 / 125
Monitoring de la JVM
● Exemple sur RuntimeMXBean
RuntimeMXBean rBean = ManagementFactory.getRuntimeMXBean();
System.out.printf("Boot classpath : %sn", rBean.getBootClassPath());
System.out.printf("classpath : %sn", rBean.getClassPath());
System.out.println("Input argument :");
List<String> arguments = rBean.getInputArguments();
for (String arg : arguments) {
System.out.println(" " + arg);
}
System.out.printf("Library path : %sn", rBean.getLibraryPath());
System.out.printf("Management spec version : %sn",
rBean.getManagementSpecVersion());
System.out.printf("Name : %sn", rBean.getName());
System.out.printf("Spec name : %sn", rBean.getSpecName());
System.out.printf("Vendor : %sn", rBean.getSpecVendor());
System.out.printf("Spec version : %sn", rBean.getSpecVersion());
System.out.printf("StartTime : %d msn", rBean.getStartTime());
antislashn.org JBoss - Supervision avec JMX 105 / 125
Service JBoss – jusqu'à version 6
● Les services sont des archives SAR déployés
dans le répertoire de déploiement
● l'archive contient un fichier de description du service
– META-INF/jboss-service.xml
● Le service créé doit utiliser les classes JBoss
● interface org.jboss.system.ServiceMBean
● classe org.jboss.system.ServiceMBeanSupport
– fournit des méthodes de gestion du cycle de vie du service
antislashn.org JBoss - Supervision avec JMX 106 / 125
Service JBoss – jusqu'à version 6
● Diagramme de classe de l'exemple HelloService
antislashn.org JBoss - Supervision avec JMX 107 / 125
Service JBoss – jusqu'à version 6
● Code de l'exemple (extraits)
public interface HelloServiceMBean extends ServiceMBean{
void setMessage(String message);
String getMessage();
void sayHello();
}
public class HelloService extends ServiceMBeanSupport implements HelloServiceMBean {
private String message;
@Override
public void setMessage(String message) {
this.message = message;
}
@Override
public String getMessage() {
return message;
}
...
}
antislashn.org JBoss - Supervision avec JMX 108 / 125
Service JBoss – jusqu'à version 6
● Contenu du fichier de déploiement
● META-INF/jboss-service.xml
– cf. la DTD jboss-service_x_y.dtd (version x, release y)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server>
<server>
<mbean code="org.antislashn.jmx.HelloService"
name="antislashn.service:service=HelloService">
<attribute name="Message">Bonjour tout le monde</attribute>
</mbean>
</server>
classe d'implémentation
ObjectName du service
initialisation de l'attribut Message
antislashn.org JBoss - Supervision avec JMX 109 / 125
Service JBoss – jusqu'à version 6
● Attributs les plus courants pour <mbean>  :
● <code> (obligatoire) : classe d'implémentation
● <name> (obligatoire) : JMX ObjectName du MBean
● <interface> : nom qualifié de l'interface, par défaut
le nom de cette interface suit la spécification MBean
antislashn.org JBoss - Supervision avec JMX 110 / 125
Service JBoss – jusqu'à version 6
● Éléments fils les plus courants pour <mbean>  :
● <constructor (args*)> : spécifie un constructeur,
si le constructeur par défaut n'est pas utilisé
– <arg> : argument du constructeur, possède les attributs
type et value
● <attribute> : permet l'initialisation d'un attribut du
MBean
● <depends> : spécifie une dépendance vers un autre
MBean
● Cf. la DTD pour une documentation exhaustive
antislashn.org JBoss - Supervision avec JMX 111 / 125
Service JBoss – jusqu'à version 6
● La console JMX de JBoss permet de vérifier la
prise en compte du déploiement du service
antislashn.org JBoss - Supervision avec JMX 112 / 125
Service JBoss – version 7
● Deux stratégies de mise en place d'un service
● service JMX MBean
– plus simple qu'avec les versions précédentes
– pas besoin d'étendre les classes et interfaces JBoss
● les méthode start() et stop() seront automatiquement appelées
– le fichier META-INF/jboss-service.xml référencie un schéma
XML au lieu d'une DTD
● service EJB
– ce n'est pas un service JMX
– avec les annotations @Singleton et @Startup
antislashn.org JBoss - Supervision avec JMX 113 / 125
Service JBoss – version 7
● Exemple de service JMX
public interface HelloServiceMBean {
void setMessage(String message);
String getMessage();
void sayHello();
}
public class HelloService implements HelloServiceMBean {
private String message;
@Override
public void setMessage(String message) {this.message = message;}
@Override
public String getMessage() {return message;}
@Override
public void sayHello() {System.out.println(">>> HelloService : "+message);}
public void start() throws Exception {System.out.println(">>> CYCLE DE VIE HelloService start");}
public void stop() {System.out.println(">>> CYCLE DE VIE HelloService stop");}
}
antislashn.org JBoss - Supervision avec JMX 114 / 125
Service JBoss – version 7
● Exemple de fichier de déploiement
● META-INF/jboss-service.xml
● cf. le schéma pour plus de détails
<?xml version="1.0" encoding="UTF-8"?>
<server xmlns="urn:jboss:service:7.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:jboss:service:7.0 jboss-service_7_0.xsd">
<mbean code="org.antislashn.jmx.HelloService"
name="antislashn.service:service=Hello,type=test">
<attribute name="Message">Hello, world</attribute>
</mbean>
</server>
antislashn.org JBoss - Supervision avec JMX 115 / 125
Service JBoss – version 7
● Le service est disponible dans la console JBoss,
ainsi que par jconsole ou jvisualvm
antislashn.org JBoss - Supervision avec JMX 116 / 125
Console en mode distant
● jconsole ou jvisualvm peuvent se connecter en
mode distant
● côté serveur JMX il faut au moins lancer l'application
Java avec l'indication du port utilisé
● lancer alors la console en mode "Remote Process"
-Dcom.sun.management.jmxremote.port=3333
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
antislashn.org JBoss - Supervision avec JMX 117 / 125
Console en mode distant
● Activation du fichier des mots de passe
● deux fichiers sont nécessaires
– fichier des droits d'accès
● par défaut : JRE_HOME/lib/management/jmxremote.acces
● définit les droits d'accès
– fichier des mots de passe
● par défaut : JRE_HOME/lib/management/jmxremote.password
● définit les mots de passe
● le fichier modèle doit être renommé
● les fichiers doivent être en lecture seule
– attention à l'héritage des droits sous Windows
antislashn.org JBoss - Supervision avec JMX 118 / 125
Console en mode distant
● Activation du fichier des mots de passe
● si les fichiers utilisé ne sont pas sous
JRE_HOME/lib/management il faut ajouter les
arguments suivant à la JVM
– ici les fichiers sont recherché dans le répertoire du projet
● En production il est préférable
● d'activer SSL
● d'utiliser JAAS pour l'authentification
-Dcom.sun.management.jmxremote.access.file=jmxremote.access
-Dcom.sun.management.jmxremote.password.file=jmxremote.password
antislashn.org JBoss - Supervision avec JMX 119 / 125
Client personnalisé en mode distant
● Si le mode distant est sécurisé, il faut passer le
rôle et le mot de passe au moment de la
connexion
● extrait de code
String[] credential = {"controlRole","titi"};
Map<String,String[]> env = new HashMap<String,String[]>();
env.put(JMXConnector.CREDENTIALS, credential);
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL,env);
MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
ObjectName objectName = new ObjectName("antislashn.jmx:bean=Hello,type=standard");
HelloMBean mBean = JMX.newMBeanProxy(serverConnection, objectName, HelloMBean.class);
antislashn.org JBoss - Supervision avec JMX 120 / 125
Console en mode distant – problèmes
potentiels
● Gestion des droits sous Windows
● au lancement du serveur JMX l'erreur suivante apparaît
● il faut modifier les droits (click droit sur le fichier)
Erreur: L'accès en lecture au fichier de mots de passe doit être limité: jmxremote.password
cf page
suivante
antislashn.org JBoss - Supervision avec JMX 121 / 125
Console en mode distant – problèmes
potentiels
● Gestion des droits sous Windows (suite)
décocher
cf page
suivante
antislashn.org JBoss - Supervision avec JMX 122 / 125
Console en mode distant – problèmes
potentiels
● Gestion des droits sous Windows (suite)
OK OK
supprimer tous les utilisateurs
sauf l'administrateur
antislashn.org JBoss - Supervision avec JMX 123 / 125
Pour aller plus loin
● MXBean
● MBean permetant l'utilisation des types utilisateurs au
travers des OpenType<T>
● OpenMBean
– dynamique MBean utilisant les OpenType<T>
● M-Let service
● service de chargement dynamique des MBeans
● RelationService
● service de mise en relation des MBeans entre eux
antislashn.org JBoss - Supervision avec JMX 124 / 125
Pour aller plus loin
● Les OpenType<T>
● décrit un type de donnée utilisé par les OpenMBeans
et les MXBeans
– SimpleType : type simple
● wrapper de type primitif, String, Date, ObjectName
– CompositeType : type composé d'autres OpenType
– TabularType : données tabulaires
– ArrayType : données sous forme de tableau
antislashn.org JBoss - Supervision avec JMX 125 / 125
Références
● Livres
● Java Management Extension
– auteur : J. Steven Perry
– éditeur : O'Reilly
● JMX – Managing J2EE with Java Management Extension
– auteurs : Juha Lindfors, Marc Fleury, The JBoss Group
– éditeur : SAMS
● Web
● http://docs.oracle.com/javase/7/docs/technotes/guides/jmx/JMX_1_4_specification.pdf
● http://www.jmdoudoux.fr/java/dej/chap-jmx.htm#jmx-12
copyleft
Support de formation créer par
Franck SIMON
http://www.franck-simon.com
copyleft
Cette œuvre est mise à disposition sous licence
Attribution
Pas d'Utilisation Commerciale
Partage dans les Mêmes Conditions 3.0 France.
Pour voir une copie de cette licence, visitez
http://creativecommons.org/licenses/by-nc-sa/3.0/fr/
ou écrivez à
Creative Commons, 444 Castro Street, Suite 900,
Mountain View, California, 94041, USA.
copyleft
Support de formation créer par
Franck SIMON
http://www.franck-simon.com
copyleft
Cette œuvre est mise à disposition sous licence
Attribution
Pas d'Utilisation Commerciale
Partage dans les Mêmes Conditions 3.0 France.
Pour voir une copie de cette licence, visitez
http://creativecommons.org/licenses/by-nc-sa/3.0/fr/
ou écrivez à
Creative Commons, 444 Castro Street, Suite 900,
Mountain View, California, 94041, USA.

Más contenido relacionado

La actualidad más candente

Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationAntoine Rey
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsAntoine Rey
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework springAntoine Rey
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Eric Bourdet
 
JSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces MobileJSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces MobileSylla Mamoudou
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
Tech Days Spring Intégration
Tech Days Spring IntégrationTech Days Spring Intégration
Tech Days Spring IntégrationArrow-Institute
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur SpringAntoine Rey
 
Java - JEE - servlets
Java - JEE - servletsJava - JEE - servlets
Java - JEE - servletsNoël
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring BatchAntoine Rey
 

La actualidad más candente (20)

Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring Integration
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Jsp
JspJsp
Jsp
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01
 
JSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces MobileJSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces Mobile
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Tech Days Spring Intégration
Tech Days Spring IntégrationTech Days Spring Intégration
Tech Days Spring Intégration
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Java Server Faces 2
Java Server Faces 2Java Server Faces 2
Java Server Faces 2
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Java EE 6 Solutions Linux 2010
Java EE 6 Solutions Linux 2010Java EE 6 Solutions Linux 2010
Java EE 6 Solutions Linux 2010
 
J2ee
J2eeJ2ee
J2ee
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
 
Java - JEE - servlets
Java - JEE - servletsJava - JEE - servlets
Java - JEE - servlets
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
 

Destacado

DIRT Challenge: Itinerario
DIRT Challenge: ItinerarioDIRT Challenge: Itinerario
DIRT Challenge: Itinerarioweplusnatalia
 
Entorno y Primeros pasos
Entorno y Primeros pasosEntorno y Primeros pasos
Entorno y Primeros pasosFati_Hdz99
 
Hipervinculo 1em alvarez
Hipervinculo 1em alvarezHipervinculo 1em alvarez
Hipervinculo 1em alvarezfrancisco263
 
Introducción al internet
Introducción al internetIntroducción al internet
Introducción al internetLizbethChinita8
 
SOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´S
SOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´SSOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´S
SOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´SMario Moreno
 
Alteraciones genéticas
Alteraciones genéticasAlteraciones genéticas
Alteraciones genéticasSunnyf1
 
Integrar la tecnología
Integrar la tecnologíaIntegrar la tecnología
Integrar la tecnologíaDebora Daniele
 
Trabajo de grupo,juliana, natalia victor
Trabajo de grupo,juliana, natalia victorTrabajo de grupo,juliana, natalia victor
Trabajo de grupo,juliana, natalia victorvima0412
 
Wed2.0 emiliana
Wed2.0 emilianaWed2.0 emiliana
Wed2.0 emilianaersc81
 
Universidad Fermin Toro Mi Vida.
Universidad Fermin Toro Mi Vida.Universidad Fermin Toro Mi Vida.
Universidad Fermin Toro Mi Vida.ameliagomezs
 
Tratados acerca de los cambios climáticos menecola
Tratados acerca de los cambios climáticos menecolaTratados acerca de los cambios climáticos menecola
Tratados acerca de los cambios climáticos menecolaLeonardo Menecola
 
Cientificos colombianos resumenes
Cientificos colombianos resumenesCientificos colombianos resumenes
Cientificos colombianos resumenestatis0531
 
Analisis de una obra arquitectonica
Analisis de una obra arquitectonicaAnalisis de una obra arquitectonica
Analisis de una obra arquitectonicaolimarantonella
 

Destacado (20)

DIRT Challenge: Itinerario
DIRT Challenge: ItinerarioDIRT Challenge: Itinerario
DIRT Challenge: Itinerario
 
Ejercicios para el taller 2
Ejercicios para el taller 2Ejercicios para el taller 2
Ejercicios para el taller 2
 
Entorno y Primeros pasos
Entorno y Primeros pasosEntorno y Primeros pasos
Entorno y Primeros pasos
 
Mi pto blog
Mi pto blogMi pto blog
Mi pto blog
 
Tiembla
TiemblaTiembla
Tiembla
 
Hipervinculo 1em alvarez
Hipervinculo 1em alvarezHipervinculo 1em alvarez
Hipervinculo 1em alvarez
 
Introducción al internet
Introducción al internetIntroducción al internet
Introducción al internet
 
SOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´S
SOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´SSOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´S
SOCIEDAD DE LA INFORMACION, CIUDADANIA DIGITAL Y LAS TIC´S
 
Alteraciones genéticas
Alteraciones genéticasAlteraciones genéticas
Alteraciones genéticas
 
Integrar la tecnología
Integrar la tecnologíaIntegrar la tecnología
Integrar la tecnología
 
Trabajo de grupo,juliana, natalia victor
Trabajo de grupo,juliana, natalia victorTrabajo de grupo,juliana, natalia victor
Trabajo de grupo,juliana, natalia victor
 
Pract4
Pract4Pract4
Pract4
 
Wed2.0 emiliana
Wed2.0 emilianaWed2.0 emiliana
Wed2.0 emiliana
 
Universidad Fermin Toro Mi Vida.
Universidad Fermin Toro Mi Vida.Universidad Fermin Toro Mi Vida.
Universidad Fermin Toro Mi Vida.
 
30 patron-chien -jp4
30 patron-chien -jp430 patron-chien -jp4
30 patron-chien -jp4
 
Tratados acerca de los cambios climáticos menecola
Tratados acerca de los cambios climáticos menecolaTratados acerca de los cambios climáticos menecola
Tratados acerca de los cambios climáticos menecola
 
Cientificos colombianos resumenes
Cientificos colombianos resumenesCientificos colombianos resumenes
Cientificos colombianos resumenes
 
French XL3 Leçon 1
French XL3 Leçon 1French XL3 Leçon 1
French XL3 Leçon 1
 
Cristian sierra
Cristian sierraCristian sierra
Cristian sierra
 
Analisis de una obra arquitectonica
Analisis de una obra arquitectonicaAnalisis de una obra arquitectonica
Analisis de una obra arquitectonica
 

Similar a JBoss - chapitre JMX

Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Nicolas Georgeault
 
System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...Microsoft Technet France
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Eric Bourdet
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Eric Bourdet
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursHoracio Gonzalez
 
Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...
Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...
Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...fabricemeillon
 
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...CERTyou Formation
 
Une gestion efficace du changement de vos structures de données relationnelle...
Une gestion efficace du changement de vos structures de données relationnelle...Une gestion efficace du changement de vos structures de données relationnelle...
Une gestion efficace du changement de vos structures de données relationnelle...Olivier DASINI
 
JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)Fourat Zouari
 
cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfRachida19
 
ToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéNicolas Deverge
 
myLittleAdmin and myLittleBackup Presentation
myLittleAdmin and myLittleBackup PresentationmyLittleAdmin and myLittleBackup Presentation
myLittleAdmin and myLittleBackup PresentationElian Chrebor
 
clientserveur.pptx
clientserveur.pptxclientserveur.pptx
clientserveur.pptxHathat10
 
Les 11 bonnes raisons de migrer vers Windows Server 2008
Les 11 bonnes raisons de migrer vers Windows Server 2008Les 11 bonnes raisons de migrer vers Windows Server 2008
Les 11 bonnes raisons de migrer vers Windows Server 2008fabricemeillon
 
BMC Mainview Data Server - Synthese et Mise en oeuvre
BMC Mainview Data Server - Synthese et Mise en oeuvreBMC Mainview Data Server - Synthese et Mise en oeuvre
BMC Mainview Data Server - Synthese et Mise en oeuvreThierry Déléris
 

Similar a JBoss - chapitre JMX (20)

Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Optimisation du stockage share point 2010
Optimisation du stockage share point 2010
 
System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Ejb 3
Ejb 3Ejb 3
Ejb 3
 
JavaEEGibello.ppt
JavaEEGibello.pptJavaEEGibello.ppt
JavaEEGibello.ppt
 
Jboss Seam
Jboss SeamJboss Seam
Jboss Seam
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
 
Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...
Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...
Comment créer, gérer et sauvegarder éfficacement vos environnements virtuels ...
 
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
 
Une gestion efficace du changement de vos structures de données relationnelle...
Une gestion efficace du changement de vos structures de données relationnelle...Une gestion efficace du changement de vos structures de données relationnelle...
Une gestion efficace du changement de vos structures de données relationnelle...
 
JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)
 
cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdf
 
ToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & Agilité
 
myLittleAdmin and myLittleBackup Presentation
myLittleAdmin and myLittleBackup PresentationmyLittleAdmin and myLittleBackup Presentation
myLittleAdmin and myLittleBackup Presentation
 
clientserveur.pptx
clientserveur.pptxclientserveur.pptx
clientserveur.pptx
 
Les 11 bonnes raisons de migrer vers Windows Server 2008
Les 11 bonnes raisons de migrer vers Windows Server 2008Les 11 bonnes raisons de migrer vers Windows Server 2008
Les 11 bonnes raisons de migrer vers Windows Server 2008
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
BMC Mainview Data Server - Synthese et Mise en oeuvre
BMC Mainview Data Server - Synthese et Mise en oeuvreBMC Mainview Data Server - Synthese et Mise en oeuvre
BMC Mainview Data Server - Synthese et Mise en oeuvre
 

Más de Franck SIMON

Distribuer une librairie via maven
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via mavenFranck SIMON
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfacesFranck SIMON
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
Description d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumDescription d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumFranck SIMON
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd trainingFranck SIMON
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrenteFranck SIMON
 
Android Input Method Editor
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method EditorFranck SIMON
 
Architectures distribuées
Architectures distribuéesArchitectures distribuées
Architectures distribuéesFranck SIMON
 
Développement Android
Développement AndroidDéveloppement Android
Développement AndroidFranck SIMON
 
Java scripting api
Java scripting apiJava scripting api
Java scripting apiFranck SIMON
 

Más de Franck SIMON (18)

Distribuer une librairie via maven
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via maven
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
 
Java 8 - lambda
Java 8 - lambdaJava 8 - lambda
Java 8 - lambda
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfaces
 
Java 8 - DateTime
Java 8 - DateTimeJava 8 - DateTime
Java 8 - DateTime
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Description d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumDescription d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimum
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd training
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 
Android Input Method Editor
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method Editor
 
Squid
SquidSquid
Squid
 
Architectures distribuées
Architectures distribuéesArchitectures distribuées
Architectures distribuées
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
 
Développement Android
Développement AndroidDéveloppement Android
Développement Android
 
jQuery
jQueryjQuery
jQuery
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
 

JBoss - chapitre JMX

  • 2. antislashn.org JBoss - Supervision avec JMX 2 / 125 JMX ● JMX : Java Management eXtension ● Standard pour la gestion et la supervision des ressources ● inclus de Java SE depuis la version 5 ● supervision des ressources matérielles et logicielles ● Standard utilisé massivement dans le monde des serveurs Java EE ● JBoss est composé d'un serveur JMX dans lequel viennent s'agréger les différents services
  • 3. antislashn.org JBoss - Supervision avec JMX 3 / 125 JMX ● Le standard impose de respecter ● une architecture ● une configuration de classes – avec un système de nommage – le contrôle est effectué par des modules applicatifs appelés MBean (Managed Bean) ● Architecture en trois couches ● niveau clients : permet le contrôle ● niveau agent : serveur ● niveau instrumentation : les MBeans
  • 4. antislashn.org JBoss - Supervision avec JMX 4 / 125 JMX source : Oracle
  • 5. antislashn.org JBoss - Supervision avec JMX 5 / 125 JMX niveau clients Services : ●Timers ●Notification Connecteurs et adaptateurs Serveur de MBean niveau agent JMX niveau instrumentation MBean MBean MBean Client JMX
  • 6. antislashn.org JBoss - Supervision avec JMX 6 / 125 Niveau instrumentation ● Une ressource administrable doit tourner dans une JVM ● application, service, périphérique ● L'instrumentation de la ressource est effectuée par les MBeans ● l'écriture d'un MBean doit suivre un modèle de conception ● une ressource instrumentée par un MBean est administrable par l'agent JMX
  • 7. antislashn.org JBoss - Supervision avec JMX 7 / 125 Niveau instrumentation ● Plusieurs types de MBeans ● Standard MBean – les fonctionnalités sont exposées statiquement par interface ● MXBean – Standard MBean possédant des contraintes sur les types ● Dynamic MBean – les fonctionnalités sont exposée dynamiquement ● Model MBean – MBean générique et configurable ● Open MBean – Dynamic MBean possédant des contraintes sur les types
  • 8. antislashn.org JBoss - Supervision avec JMX 8 / 125 Niveau agent Serveur de MBeans MBean Registry MBean meta data Client MBean MBean
  • 9. antislashn.org JBoss - Supervision avec JMX 9 / 125 Niveau agent ● L'agent JMX (ou serveur JMX) est composé de ● du serveur de MBean – classe MBeanServer ● de services – service de notifications : classe Notification – service de timer : classe Timer ● des connecteurs et adaptateurs de protocoles pour dialoguer avec la couche client – connecteur : permet à un client Java de se connecter au serveur – utilise RMI – adaptateurs de protocoles : permet au client d'utiliser d'autres protocoles que RMI
  • 10. antislashn.org JBoss - Supervision avec JMX 10 / 125 Niveau agent ● Le serveur de MBean joue le rôle de registre d'objets ● un MBean doit s'enregistrer avec un nom unique auprès du serveur – le nom est de type ObjectName ● composé d'un domaine et de propriétés (séparateurs : et ,) – l'enregistrement peut être effectué par ● l'agent lui-même ● un autre MBean ● une application distante via un service distribué jboss.deployment:flavor=URL,type=DeploymentScanner
  • 11. antislashn.org JBoss - Supervision avec JMX 11 / 125 Niveau agent ● Une fois enregistré, un certain nombres d'opérations sont disponibles sur le MBean ● découverte des opérations disponibles sur le MBean ● lecture et écriture des attributs ● invocation des opérations du MBean ● récupération des notifications émises par le MBean
  • 12. antislashn.org JBoss - Supervision avec JMX 12 / 125 Niveau agent ● Les services d'agent ● sont généralement eux-mêmes des MBeans ● gèrent les opération de gestion des MBeans ● par défaut : – service m-let (Management Applet) ● gestion du chargement dynamique des classes – service moniteur ● gestion des notification – service de timers ● déclenchements réguliers d'action sur les MBeans – service de mise en relation des MBeans entre eux
  • 13. antislashn.org JBoss - Supervision avec JMX 13 / 125 Niveau client ● Client du niveau agent ● Ce niveau fournit une interface de supervision et administration ● Deux outils sont fournis par le JDK ● jconsole ● jvisualvm – regroupe plusieurs outils – la visualisation des MBeans nécessite le chargement d'un plugin ● Possibilité de créer son propre client
  • 14. antislashn.org JBoss - Supervision avec JMX 14 / 125 JMX ● Le MBean suit un modèle de conception ● il comporte – des attributs en lecture / écriture ● spécification des getteur/setteur – des opérations – et éventuellement une description
  • 15. antislashn.org JBoss - Supervision avec JMX 15 / 125 Standard MBean ● Modèle de conception ● spécification de nommage entre l'interface qui expose les attributs et opération et la classe d'implémentation ● la classe d'implémentation doit posséder un constructeur par défaut ● les attributs sont spécifiés par les méthodes getXxx(), setXxx() et isXxx()
  • 16. antislashn.org JBoss - Supervision avec JMX 16 / 125 Standard MBean ● Codage simple ● une interface – même nom que la classe d'implémentation suffixé par MBean – les getteur/setteur indique si l'attribut est en lecture et/ou écriture ● une classe d'implémentation
  • 17. antislashn.org JBoss - Supervision avec JMX 17 / 125 Standard MBean : couche agent ● Le MBean est identifié dans le serveur par son nom ● ou ObjectName ● composé de deux parties – le domaine – les propriétés – les deux sont séparés par le caractère : jboss.deployment:flavor=URL,type=DeploymentScanner
  • 18. antislashn.org JBoss - Supervision avec JMX 18 / 125 Standard MBean : couche agent ● Étapes principales ● récupération d'un serveur de MBeans ● création d'un ObjectName pour l'enregistrement du MBean ● enregistrement du MBean auprès du serveur MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mBeanName = new ObjectName("antislashn.jmx:bean=Hello,type=standard"); HelloMBean mBean = new Hello(); mbs.registerMBean(mBean, mBeanName);
  • 19. antislashn.org JBoss - Supervision avec JMX 19 / 125 Standard MBean : couche agent ● Pour exécuter le serveur de MBean, il faut activer l'accès distant à JMX ● -Dcom.sun.management.jmxremote ● d'autres propriétés peuvent être précisées si en mode remote ● un modèle de fichier de mot de passe est proposé dans le répertoire lib/management du JRE java -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false MonAppliJava
  • 20. antislashn.org JBoss - Supervision avec JMX 20 / 125 Standard MBean : supervision ● Des utilitaires de supervisions sont livrés avec le JDK ● jconsole ● jvisualvm – qui intègre les utilitaire jconsole, jstat , jinfo, jmap
  • 21. antislashn.org JBoss - Supervision avec JMX 21 / 125 Standard MBean : supervision ● Exemple de copie d'écran avec jvisualvm
  • 22. antislashn.org JBoss - Supervision avec JMX 22 / 125 StandardMBean : codage d'un client ● Pour que le client se connecte au serveur de MBean, il faut que celui ci soit lancé avec les arguments suivants -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
  • 23. antislashn.org JBoss - Supervision avec JMX 23 / 125 StandardMBean : codage d'un client ● Les étapes de codage ● créer une URL ● récupérer un connecteur ● récupérer une connexion ● récupérer un proxy vers le MBean JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("antislashn.jmx:bean=Hello,type=standard"); HelloMBean mBean = JMX.newMBeanProxy(serverConnection, objectName, HelloMBean.class); System.out.println(">>> "+mBean.getName()); le client connaît la classe du MBean port passé en argument à la JVM du server
  • 24. antislashn.org JBoss - Supervision avec JMX 24 / 125 Dynamic MBean ● Implémente l'interface DynamicMBean ● la lecture des attributs et opérations disponibles ne se fait plus par introspection – utilisation des méthodes redéfinies ● bien que plus complexe à coder, ce type de bean est plus puissant – exposition des attributs et opérations à l'exécution ● pour le Standard MBean l'exposition est effectuée à la compilation – pas d'import de classes spécifique côté client
  • 25. antislashn.org JBoss - Supervision avec JMX 25 / 125 Dynamic MBean ● Les méthodes de DynamicMean permettent ● de découvrir les attributs et opérations du MBean – getMBeanInfo() ● de retrouver la valeur d'un attribut, ou d'une liste d'attributs – Object getAtribute(String attribute) – AttributeList getAttributes(String[] attributes) ● mettre à jour la valeur d'un attribut, ou d'une liste d'attributs – void setAttribute(Attribute attribute) – AttributeList setAttributes(AttributeList attributes) ● d'invoquer une opération – Object invoke(String action,Object[] params, Object[] types)
  • 26. antislashn.org JBoss - Supervision avec JMX 26 / 125 Dynamic MBean ● Méta-classes de description ● MBeanInfo : une instance par Dynamic MBean – conteneur de méta données ● MBeanAttributeInfo : une instance par attribut ● MBeanParameterInfo : une instance par paramètre ● MBeanConstructorInfo : une instance par constructeur – contient un ou plusieurs MBeanParameterInfo ● MBeanOperationInfo : une instance par opération – contient un ou plusieurs MBeanParameterInfo ● MBeanNotificationInfo : une instance par groupe de notifications
  • 27. antislashn.org JBoss - Supervision avec JMX 27 / 125 Dynamic MBean ● MBeanAttributeInfo ● description d'un attribut – name : nom de l'attribut tel qu'il apparaît dans l'interface de gestion – type : classe de l'attribut sous forme d'un String ● Integer.TYPE.getName() ou Hello.class.getName() par exemple – description : description de l'attribut – isReadable : indicateur de lecture – isWritable : indicateur d'écriture – isis : indicateur d'attribut de type booléen ● l'accesseur débute alors par is au lieu de get
  • 28. antislashn.org JBoss - Supervision avec JMX 28 / 125 Dynamic MBean ● MBeanParameterInfo ● description d'un paramètre de constructeur ou d'opération – name : nom du paramètre tel qu'il apparaît dans l'interface de gestion – type : classe du paramètre sous forme d'un String – description : description du paramètre
  • 29. antislashn.org JBoss - Supervision avec JMX 29 / 125 Dynamic MBean ● MBeanConstructorInfo ● description d'un constructeur – name : nom du constructeur tel qu'il apparaît dans l'interface de gestion – description : description du paramètre – signature : tableau de MBeanParameterInfo correspondant à la signature du constructeur
  • 30. antislashn.org JBoss - Supervision avec JMX 30 / 125 Dynamic MBean ● MBeanOperationInfo ● description d'une opération – name : nom de l'opération telle qu'elle apparaît dans l'interface de gestion – description : description du paramètre – signature : tableau de MBeanParameterInfo correspondant à la signature du constructeur – type : type du retour – impact : indicateur d'impact sur l'état du bean
  • 31. antislashn.org JBoss - Supervision avec JMX 31 / 125 Dynamic MBean ● MBeanOperationInfo ● valeurs possibles pour la propriété impact – INFO : état du MBean inchangé, l'opération retourne une information – ACTION : l'état du MBean a changé – ACTION_INFO : l'état du MBean a changé, et l'opération retourne une information – UNKNOW : l'impact de l'opération sur l'état du MBean est inconnu
  • 32. antislashn.org JBoss - Supervision avec JMX 32 / 125 Dynamic MBean ● MBeanNotificationInfo ● description d'une notification – name : nom de la notification telle qu'elle apparaît dans l'interface de gestion – description : description du paramètre – notifsType : types des notifications qui sont émises par le MBean sous forme d'un tableau de String ● un type de notification est du type : vendor[.application][.component][.eventGroup].event
  • 33. antislashn.org JBoss - Supervision avec JMX 33 / 125 Dynamic MBean ● MBeanInfo ● description d'un MBean – className : nom de la classe du MBean (String) – description : description du paramètre – attributes : tableau des MBeanAttributeInfo – constructors : tableau des MBeanConstructorInfo – operations : tableau des MBeanOperationInfo – notifications : tableau des MBeanNotificationInfo
  • 34. antislashn.org JBoss - Supervision avec JMX 34 / 125 Dynamic MBean ● Codage du MBean ● l'exemple reprends du Standard MBean Hello public interface HelloMBean { // attributs String getName(); String getColor(); void setColor(String color); // opérations void sayHello(); double add(double a, double b); } public class Hello implements HelloMBean { private String name ="Toto MBean"; private String color = "vert"; @Override public String getName() { return name; } @Override public String getColor() { return color; } @Override public void setColor(String color) { this.color = color; } @Override public void sayHello() { System.out.println(">>> Standard MBean "+name+" - "+color); } @Override public double add(double a, double b) { return a+b; } }
  • 35. antislashn.org JBoss - Supervision avec JMX 35 / 125 Dynamic MBean - codage ● Déclaration des attributs ● constructeur de la classe MBeanAttributeInfo : ● code (extrait) MBeanAttributeInfo[] attributeInfos = new MBeanAttributeInfo[2]; attributeInfos[0] = new MBeanAttributeInfo("Name",String.class.getName(), "Nom du MBean",false,true,false); attributeInfos[1] = new MBeanAttributeInfo("Color", String.class.getName(), "Couleur du MBean", true, true, false); MBeanAttributeInfo(String name, String type, String description, boolean isReadable, boolean isWritable, boolean isIs)
  • 36. antislashn.org JBoss - Supervision avec JMX 36 / 125 Dynamic MBean - codage ● Déclaration des opérations ● constructeur de la classe MBeanOperationInfo : ● code (extrait) MBeanOperationInfo[] operationInfos = new MBeanOperationInfo[5]; MBeanParameterInfo[] parameterInfos = new MBeanParameterInfo[2]; parameterInfos[0] = new MBeanParameterInfo("a", Double.TYPE.getName(), "Paramètre a"); parameterInfos[1] = new MBeanParameterInfo("a", Double.TYPE.getName(), "Paramètre a"); operationInfos[0] = new MBeanOperationInfo("add", "addition de deux double", parameterInfos, Double.TYPE.getName(), MBeanOperationInfo.UNKNOWN); MBeanOperationInfo(String name, Method method)
  • 37. antislashn.org JBoss - Supervision avec JMX 37 / 125 Dynamic MBean - codage ● Méthode getAttribute(...) public Object getAttribute(String attributeName) throws AttributeNotFoundException, MBeanException, ReflectionException { if(attributeName.equals("Color")){ return this.color; } else if(attributeName.equals("Name")){ return this.name; } else throw new AttributeNotFoundException("Can't find "+attributeName); }
  • 38. antislashn.org JBoss - Supervision avec JMX 38 / 125 Dynamic MBean - codage ● Méthode getAttributes(...) ● retour de type AttributeList – étend ArrayList, mais sans généricité sur Attribute – contient des instances de type Attribute ● encapsule les nom et valeur d'un attribut public AttributeList getAttributes(String[] attributeNames) { AttributeList list = new AttributeList(); for(String name : attributeNames){ try { Object value = this.getAttribute(name); list.add(new Attribute(name, value)); } catch (AttributeNotFoundException | MBeanException | ReflectionException e) { e.printStackTrace(); } } return list; }
  • 39. antislashn.org JBoss - Supervision avec JMX 39 / 125 Dynamic MBean - codage ● Méthode setAttribute(...) public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { String name = attribute.getName(); Object value = attribute.getValue(); if(name.equals("Color") && (value instanceof String)){ this.setColor((String) value); } else { new AttributeNotFoundException("Attribut "+name+" inconnu ou en lecture seule"); } }
  • 40. antislashn.org JBoss - Supervision avec JMX 40 / 125 Dynamic MBean - codage ● Méthode setAttributes(...) public AttributeList setAttributes(AttributeList attributes) { AttributeList list = new AttributeList(); for(int i=0 ; i<attributes.size() ; i++){ try{ Attribute attribute = (Attribute) attributes.get(i); this.setAttribute(attribute); String name = attribute.getName(); Object value = attribute.getValue(); list.add(new Attribute(name, value)); } catch(Exception e){ e.printStackTrace(); } } return list; }
  • 41. antislashn.org JBoss - Supervision avec JMX 41 / 125 Dynamic MBean - codage ● Méthode invoke(...) ● est invoquée pour chaque opération – pas pour les accesseurs/mutateurs des attributs ● il faut vérifier que le nom de la méthode et la signature soient adéquats – sinon il faut lever une ReflectionException ● il faut aussi vérifier le tableau des paramètres – les types des paramètres correspondent-ils à la signature
  • 42. antislashn.org JBoss - Supervision avec JMX 42 / 125 Dynamic MBean - codage ● Méthode invoke(...) public Object invoke(String operationName, Object[] params, String[] signature) throws MBeanException, ReflectionException { Object retour = null; if(operationName.equals("sayHello")){ this.sayHello(); retour = Void.TYPE; } else if(operationName.equals("add")){ if(signature[0].equals(Double.TYPE.getName()) && signature[1].equals(Double.TYPE.getName())){ if(params[0] instanceof Double && params[1] instanceof Double){ double a = ((Double)params[0]).doubleValue(); double b = ((Double)params[1]).doubleValue(); retour = new Double(a+b); } } } else new ReflectionException(new NoSuchMethodException("Unknow operation : "+operationName)); return retour; }
  • 43. antislashn.org JBoss - Supervision avec JMX 43 / 125 Dynamic MBean ● Plus complexe à coder, mais... ● les opérations et attributs peuvent évoluer durant le cycle de vie du bean – les méthodes de description du MBean sont appelées tout au long de l'utilisation du MBean – pour un Standard MBean, l'exposition des attributs et des méthodes passe par une interface
  • 44. antislashn.org JBoss - Supervision avec JMX 44 / 125 Dynamic MBean : codage d'un client ● Étapes de codage ● construction de l'URL ● récupération d'un connecteur ● récupération d'une connexion au serveur JMX ● utilisation de la connexion au serveur pour – récupérer les méta-données du MBean – utiliser les attributs – invoquer les opérations
  • 45. antislashn.org JBoss - Supervision avec JMX 45 / 125 Dynamic MBean : coadeg d'un client ● Exemple de code JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("antislashn.jmx:bean=Hello,type=dynamic"); MBeanInfo beanInfo = serverConnection.getMBeanInfo(objectName); MBeanAttributeInfo[] attributeInfos = beanInfo.getAttributes(); MBeanOperationInfo[] operationInfos = beanInfo.getOperations(); for(MBeanAttributeInfo att : attributeInfos){ System.out.println(">>> Attribut : "+att.getName()+" == "+ serverConnection.getAttribute(objectName, att.getName())); } for(MBeanOperationInfo op : operationInfos){ System.out.println(">>> Opération : "+op.getName()); if(op.getName().equals("sayHello")) System.out.println("=> sayHello() returns "+ serverConnection.invoke(objectName, op.getName(), new Object[0], new String[0])); } le client ne connaît pas la classe du MBean
  • 46. antislashn.org JBoss - Supervision avec JMX 46 / 125 Model MBean ● Type de MBean dynamique ● n'implémente aucune interface ● Le MBean n'a pas besoin de détenir une référence vers la ressource à gérer ● Utilise la classe RequiredModelBean pour associer une description de MBean à la ressource à superviser
  • 47. antislashn.org JBoss - Supervision avec JMX 47 / 125 Model MBean ● Pour résoudre l'interface du Model MBean, on utilise une classe de méta-données ● Descriptor – interface implémentée par DescriptionSupport – collection de paires nom/valeur (String/Object) ● une paire représente un attribut, un constructeur, une opération ou une notification ● il y a un descripteur par type de champ ● le descripteur décrit complètement le champ par la paire nom/valeur – les noms utilisés sont liés à la spécification
  • 48. antislashn.org JBoss - Supervision avec JMX 48 / 125 Model MBean ● Interface Descriptor ● permet la résolution des champs – les noms de champs sont spécifiés par JMX – des noms personnalisés peuevent être ajoutés ● méthodes – Object getFieldValue(String fieldName) – void setField(String fieldName, Object fieldValue) – String[] getFields() – String[] getFieldNames() – void removeField(String fieldName) – void setFields(String[] fieldNames, Object[] fieldValues)
  • 49. antislashn.org JBoss - Supervision avec JMX 49 / 125 Model MBean ● Champs utilisés par la spécification ● name (obligatoire) : nom utilisé par le champ ● descriptorType (obligatoire) : description du type de champ, valeurs possibles – MBean, attribute, operation, notification ● displayName : nom utilisé pour l'affichage dans le client ● getMethod : nom du getteur si le type est un attribut – doit être déclaré dans les opérations ● setMethod : nom du setteur si le type est un attribut – doit être déclaré dans les opérations
  • 50. antislashn.org JBoss - Supervision avec JMX 50 / 125 Model MBean ● Champs utilisés par la spécification ● currencyTimeLimit : utilisé sur les attributs (getteur) et retour d'opérations pour estimer sa validité – une marque lastUpdateTimeStamp est déposée sur chaque valeur retournée – unité : ms ● log : sur les notification, indicateur booléen ● logFile : obligatoire si log est utilisé, contient le chemin d'un fichier de log
  • 51. antislashn.org JBoss - Supervision avec JMX 51 / 125 Model MBean ● Champs utilisés par la spécification ● default : valeur par défaut d'un attribut – utilise le setteur ● export : indicateur booléen utilisé pour la distribution du MBean dans un environnement distribué ● role: utilisé sur les opération, sa valeur peut être – operation, constructor, getter, setter ● persistPeriod : période de persistance en s, si une persitPolicy a été déclarée avec la valeur NoMoreOftenThan ou OnTimer
  • 52. antislashn.org JBoss - Supervision avec JMX 52 / 125 Model MBean ● Champs utilisés par la spécification ● persistPolicy : stratégie de persistance, valeurs possibles – Never, OnTimer, OnUpdate, NoMoreOftenThan ● severity : degrès de sévérité d'une notification – 0 : indéterminé – et de 1 (NonRecoverable) à 6 (informative) ● value : utilisé comme cache sur les valeur d'attribut en conjonction avec le champ currencyTimeLimit
  • 53. antislashn.org JBoss - Supervision avec JMX 53 / 125 Model MBean ● Codage d'un descripteur ● Le descripteur peut être une chaîne XML ● Peut aussi être un tableau de String, String + Object Descriptor attrDescriptor = new DescriptorSupport(); attrDescriptor.setField("name", "Name"); attrDescriptor.setField("descriptorType", "attribute"); attrDescriptor.setField("displayName", "Nom du Model MBean"); attrDescriptor.setField("getMethod", "getName"); <descriptor> <field name="name" value="Name" /> <field name="descriptorType" value="attribute"/> <field name="displayName" value="Nom du Model MBean"/> <field name="getMethod" value="getName"/> </descriptor> Descriptor attrDescriptor = new DescriptorSupport(descriptorXML) ;
  • 54. antislashn.org JBoss - Supervision avec JMX 54 / 125 Model MBean ● Description de l'interface du MBean ● comme pour le Dynamic MBean il y a un ensemble de classes pour les méta-données – ModelMBeanAttributeInfo : une instance par attribut – ModelMBeanConstructorInfo : une instance par constructeur – ModelMBeanOperationInfo : une instance par opération – ModelMBeanNotificationInfo : une instance par groupe de notifications – ModelMBeanInfoSupport : une instance pour le MBean ● conteneur des méta-données
  • 55. antislashn.org JBoss - Supervision avec JMX 55 / 125 Model MBean ● Constructeurs des classes méta-données ● sauf pour ModelMBeanInfo ● plusieurs constructeurs – cf. documentation – certains ne prennent pas d'instance de Descriptor ● il y a alors création d'une instance de Descriptor par défaut, avec les champs nécessaires – l'utilisation d'un Descriptor permet d'ajouter les champs non prévus par les constructeurs
  • 56. antislashn.org JBoss - Supervision avec JMX 56 / 125 Model MBean ● Méta-données pour les attributs attributeInfos = new ModelMBeanAttributeInfo[2]; Descriptor nameDescriptor = new DescriptorSupport(); nameDescriptor.setField("name", "Name"); nameDescriptor.setField("descriptorType", "attribute"); nameDescriptor.setField("displayName", "Nom du ModelMBean Hello"); nameDescriptor.setField("getMethod", "getName"); Descriptor colorDescriptor = new DescriptorSupport(); colorDescriptor.setField("name", "Color"); colorDescriptor.setField("descriptorType", "attribute"); colorDescriptor.setField("displayName", "Couleur ModelMBean Hello"); colorDescriptor.setField("currencyTimeLimit", -1); colorDescriptor.setField("getMethod", "getColor"); colorDescriptor.setField("setMethod", "setColor"); attributeInfos[0] = new ModelMBeanAttributeInfo("Name", String.class.getName(), "Nom du Model MBean", true, false,false, nameDescriptor); attributeInfos[1] = new ModelMBeanAttributeInfo("Color",String.class.getName(), "Couleur du Model MBean", true,true,false,colorDescriptor);
  • 57. antislashn.org JBoss - Supervision avec JMX 57 / 125 Model MBean ● Méta-données pour les opérations operationInfos = new ModelMBeanOperationInfo[5]; MBeanParameterInfo a = new MBeanParameterInfo("a", Integer.TYPE.getName(), "Premier paramètre de l'addition"); MBeanParameterInfo b = new MBeanParameterInfo("b", Integer.TYPE.getName(), "Second paramètre de l'addition"); MBeanParameterInfo color = new MBeanParameterInfo("colorr", String.class.getName(), "Couleur du bean"); operationInfos[0] = new ModelMBeanOperationInfo("add","Addition entre deux entiers", new MBeanParameterInfo[]{a,b}, Integer.TYPE.getName(),ModelMBeanOperationInfo.INFO); operationInfos[1] = new ModelMBeanOperationInfo("sayHello","Juste un Hello, world", null, Void.TYPE.getName(),ModelMBeanOperationInfo.INFO); operationInfos[2] = new ModelMBeanOperationInfo("getName","getName()", null, String.class.getName(),ModelMBeanOperationInfo.INFO); operationInfos[3] = new ModelMBeanOperationInfo("getColor","getColor()", null, String.class.getName(),ModelMBeanOperationInfo.INFO); operationInfos[4] = new ModelMBeanOperationInfo("setColor","setColor()", new MBeanParameterInfo[]{color}, Void.TYPE.getName(),ModelMBeanOperationInfo.INFO);
  • 58. antislashn.org JBoss - Supervision avec JMX 58 / 125 Model MBean ● Méta-données pour le Model MBean ● Association avec la ressource mBeanInfo = new ModelMBeanInfoSupport("ModelMBeanHello", "Exemple de Model MBean", attributeInfos, null, operationInfos, null); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mBeanName = new ObjectName("antislashn.jmx:bean=Hello,type=model"); ModelMBeanHelloFactory factory = new ModelMBeanHelloFactory(); Hello hello = new Hello(); RequiredModelMBean mBean = new RequiredModelMBean(factory.getModelMBeanInfo()); mBean.setManagedResource(hello,"objectReference"); mbs.registerMBean(mBean, mBeanName);
  • 59. antislashn.org JBoss - Supervision avec JMX 59 / 125 Model MBean ● Exemple de construction des méta-données ● extrait Descriptor attrDescriptor = new DescriptorSupport(); attrDescriptor.setField("name", "Name"); attrDescriptor.setField("descriptorType", "attribute"); attrDescriptor.setField("displayName", "Nom du Model MBean"); attrDescriptor.setField("getMethod", "getName"); attributeInfos[0] = new ModelMBeanAttributeInfo("Name", String.class.getName(), "Nom du Model MBean", true, false,false, attrDescriptor); attributeInfos[1] = new ModelMBeanAttributeInfo("Color",String.class.getName(), "Couleur du Model MBean", true,true,false); mBeanInfo = new ModelMBeanInfoSupport("ModelMBeanHello", "Exemple de Model MBean", attributeInfos, null, operationInfos, null); ModelMBeanAttributeInfo(String name, String type, String description, boolean isReadable, boolean isWritable, boolean Descriptor descriptor)
  • 60. antislashn.org JBoss - Supervision avec JMX 60 / 125 Model MBean ● Récupération du Descriptor ● auprès des classes de méta-données ● méthode Descriptor getDescriptor() ● il est ainsi possible de gérer le descripteur – lister les champs – ajouter des champs – ...
  • 61. antislashn.org JBoss - Supervision avec JMX 61 / 125 Model MBean ● Mise en relation de la ressource à gérer avec la description du MBean ObjectName mBeanName = new ObjectName("antislashn.jmx:bean=Hello,type=model"); ModelMBeanHelloFactory factory = new ModelMBeanHelloFactory(); Hello hello = new Hello(); RequiredModelMBean mBean = new RequiredModelMBean(factory.getModelMBeanInfo()); mBean.setManagedResource(hello,"ObjectReference"); mbs.registerMBean(mBean, mBeanName); classe utilitaire construisant les descripteur association du descripteur et de la ressource
  • 62. antislashn.org JBoss - Supervision avec JMX 62 / 125 Model MBean ● Association entre la ressource et le descripteur de MBean ● type de référence – ObjectReference : seul supporté par défaut dans le JDK – Handle – IOR – EJBHandle – RMIReference
  • 63. antislashn.org JBoss - Supervision avec JMX 63 / 125 Model MBean ● Résumé des étapes d'instrumentation d'une ressource ● instancier la ressource à gérer ● instancier la classe RequiredModelBean ● créer les classes de méta-données nécessaires ● créer la méta-donnée pour la ressource – ModelMBeanInfo ● ajouter à l'instance de RequiredModelBean la méta- donnée de type ModelMBeanInfo ● associer la ressource
  • 64. antislashn.org JBoss - Supervision avec JMX 64 / 125 MBean - comparaison type de MBean connaissance du MBean par le client complexité de codage utilisation des Open Type Standard MBean oui simple non Dynamic MBean non tout doit être codé non Model MBean non implémentation par défaut fournie non MXBean oui simple oui Open MBean non complexe oui ● Les Model MBean et Dynamic MBean sont mis en relation avec la ressource à surveiller ● ils ne possèdent pas de référence vers cette ressource ● ils n'encapsulent pas cette ressource
  • 65. antislashn.org JBoss - Supervision avec JMX 65 / 125 Notification d'événements ● Le changement d'état d'une ressource peut-être notifiée ● par programmation ● par utilisation du service de monitoring ● La notification est une information envoyée par un émetteur vers un listener via l'infrastructure JMX ● contient au minimum – le type de la notification – String ● du type vendor[.application][.component][.eventGroup].event – une référence vers l'émetteur – un numéro de séquence qui identifie l'occurrence de la notification
  • 66. antislashn.org JBoss - Supervision avec JMX 66 / 125 Notification d'événements ● Classes et interfaces principales ● classe Notification : représente une notification – envoyée par un émetteur (broadcaster) vers un récepteur (listener) ● interface NotificationFilter : permet au listener de ne recevoir qu'une partie des notifications – implémentée par NotificationFilterSupport ● interface NotificationBroadcaster : implémentée par tous les émetteurs – implémentée par NotificationBroadcastSupport ● interface NotificationListener : implémentée par les récepteurs de notification
  • 67. antislashn.org JBoss - Supervision avec JMX 67 / 125 Notification d'événements ● Un émetteur : ● implémente l'interface NotificationBroadcaster – ou étend NotificationBroadcasterSupport ● fournir à l'infrastructure JMX les notifications susceptibles d'être émises – méthode MBeanNotificationInfo[] getNotificationInfo() ● Un récepteur étends l'interface NotificationListener ● le listener peut recevoir un sous-ensemble des notifications en fournissant une filtre – le filtre implémente NotificationFilter
  • 68. antislashn.org JBoss - Supervision avec JMX 68 / 125 Notification d'événements - exemple ● Une classe Compteur fait évoluer régulièrement une valeur interne ● une notification sera émise à chaque changement de cette valeur ● La classe Compteur ● implémente CompteurMBean ● étend NotificationBroadcastSupport – redéfinition de la méthode getNotificationInfo() ● maintient un numéro de séquence de notification ● envoie une notification sur sa méthode setValue(...)
  • 69. antislashn.org JBoss - Supervision avec JMX 69 / 125 Notification d'événements - exemple ● Redéfinition de la méthode getNotificationInfo() ... @Override public MBeanNotificationInfo[] getNotificationInfo(){ MBeanNotificationInfo[] infos = new MBeanNotificationInfo[1]; String[] types = new String[]{"antislashn.compteur.value"}; String name = AttributeChangeNotification.class.getName(); String description = "Un attribut de Compteur a changé"; MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description); infos[0] = info; return infos; } ...
  • 70. antislashn.org JBoss - Supervision avec JMX 70 / 125 Notification d'événements - exemple ● Envoi de la notification ● la notification comporte au moins – le type de notification – String – une référence vers l'émetteur de la notification – le numéro de séquence ● plusieurs constructeurs permettent d'ajouter – un horodatage – un message – une référence vers un Object ● permet le passage d’informations supplémentaires entre l'émetteur et le récepteur – méthode setUserData(Object userData)
  • 71. antislashn.org JBoss - Supervision avec JMX 71 / 125 Notification d'événements - exemple ● Envoi de la notification ● Nota : la classe AttributeChangeNotification aurait pu être utilisée ● permet d'ajouter des informations sur la valeur de l'attribut – ancienne valeur et nouvelle valeur Notification notification = new Notification("antislashn.compteur.value", this, sequenceNumber++); sendNotification(notification);
  • 72. antislashn.org JBoss - Supervision avec JMX 72 / 125 Notification d'événements - exemple ● Pour suivre les notification dans jconsole ou jvisualvm, il faut d'abord souscrire
  • 73. antislashn.org JBoss - Supervision avec JMX 73 / 125 Notification d'événements - exemple ● Et de voir les changements
  • 74. antislashn.org JBoss - Supervision avec JMX 74 / 125 Notification d'événements - exemple ● L'implémentation de NotificationListener permet de suivre les notifications avec son propre client ● le client doit auparavant se connecter sur notre serveur JMX – via un adaptateur RMI ● l'url comporte le port d'écoute du serveur – argument com.sun.management.jmxremote.port JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
  • 75. antislashn.org JBoss - Supervision avec JMX 75 / 125 Notification d'événements - exemple ● Le client doit ensuite retrouver le MBean pour s'enregistrer en tant que listener ObjectName objectName = new ObjectName("antislashn.jmx:type=Compteur,subtype=Notification"); CompteurMBean compteurMBean = JMX.newMBeanProxy(serverConnection, objectName, CompteurMBean.class, true); serverConnection.addNotificationListener(objectName, new CompteurListener(), null, null); le MBean peut envoyer des notifications pas de filtre pas d'objet handback
  • 76. antislashn.org JBoss - Supervision avec JMX 76 / 125 Notification d'événements - exemple ● Le listener n'a qu'une méthode à implémenter ● handleNotification() – premier paramètre : la notification – seconde paramètre : l'objet handback class CompteurListener implements NotificationListener{ @Override public void handleNotification(Notification notification, Object handback) { System.out.println(">>> Notification "+notification.getSource()); } } renvoie l'OjectName du MBeanc
  • 77. antislashn.org JBoss - Supervision avec JMX 77 / 125 Notification d'événements - exemple ● Utilisation d'une donnée utilisateur ● les ancienne et nouvelle valeurs du compteur sont encapsulées dans une classe public class UserData implements Serializable{ private int oldValue; private int newValue; public UserData(int oldValue, int newValue) { this.oldValue = oldValue; this.newValue = newValue; } public int getOldValue() { return oldValue; } public int getNewValue() { return newValue; } }
  • 78. antislashn.org JBoss - Supervision avec JMX 78 / 125 Notification d'événements - exemple ● Utilisation d'une donnée utilisateur ● mise en place de la donnée utilisateur côté MBean ● ● ● ● récupération dans le listener (côté client) private void sendNotification() { Notification notification = new Notification("antislashn.compteur.value", this, sequenceNumber++); UserData userData = new UserData(value-1, value); notification.setUserData(userData); sendNotification(notification); } class CompteurListener implements NotificationListener{ @Override public void handleNotification(Notification notification, Object handback) { System.out.println(">>> Notification "+notification.getSource()); if(notification.getUserData()!=null){ UserData userData = (UserData) notification.getUserData(); System.out.println("t oldValue == "+userData.getOldValue()+ " - newValue == "+userData.getNewValue()); } } }
  • 79. antislashn.org JBoss - Supervision avec JMX 79 / 125 Notification d'événements - exemple ● Utilisation de l'objet de retour ● objet créé par le listener ● passé à l'émetteur de notification via la méthode addNotificationListener() ● retourné à la méthode handleNotification() du listener ● Permet de créer des contextes propres aux listeners
  • 80. antislashn.org JBoss - Supervision avec JMX 80 / 125 Notification d'événements - exemple ● Mise en place du handback ● lors de l'ajout du listener ● l'objet peut-être évidemment de tout type ● Récupération du handback String typeLog = "email"; serverConnection.addNotificationListener(objectName, new CompteurListener(), null, typeLog); class CompteurListener implements NotificationListener{ @Override public void handleNotification(Notification notification, Object handback) { String typeLog = (String) handback; if(typeLog.equals("console")){ System.out.println(">>> Notification sur la console "+notification.getSource()); }else if(typeLog.equals("email")){ sendEmail(); } } }
  • 81. antislashn.org JBoss - Supervision avec JMX 81 / 125 Notification d'événements - exemple ● Filtrer les notifications ● par implémentation de NotificationFilter – encapsule la liste des types de notifications permis – définit la méthode isNotificationEnabled() qui renvoie un booléen indiquant la prise en charge ou non de l'envoi de la notification au listener ● par utilisation de la classe NotificationFilterSupport – la méthode enableType() permet d'enregistrer les types de notifications permis ● l'enregistrement du filtre est effectué lors de l'ajout du listener – méthode addNotificationListener(...)
  • 82. antislashn.org JBoss - Supervision avec JMX 82 / 125 Notification d'événements - exemple ● Filtrer les notifications ● par implémentation de NotificationFilter class CompteurNotificationFilter implements NotificationFilter { String[] types = { "antislashn.counter.down" }; @Override public boolean isNotificationEnabled(Notification notification) { for (String type : types) { if (type.equals(notification.getType())) return true; } return false; } }
  • 83. antislashn.org JBoss - Supervision avec JMX 83 / 125 Notification d'événements - exemple ● Filtrer les notifications ● par utilisation de NotificationFilterSupport NotificationFilterSupport filter = new NotificationFilterSupport(); filter.enableType("antislashn.counter.down"); serverConnection.addNotificationListener(objectName, new CompteurListener(), filter, null);
  • 84. antislashn.org JBoss - Supervision avec JMX 84 / 125 MXBean ● Le MXBean est un Standard MBean avec des restrictions sur les types ● pas d'utilisation de types personnalisés ● utilisation de OpenType<T> et de ses types dérivés ● le client de MXBean n'a pas besoin de connaître la classe métier utilisée – le codage de la partie cliente est moins directe ● mais plus générique ● cf. http://docs.oracle.com/javase/7/docs/api/javax/management/MXBean.html
  • 85. antislashn.org JBoss - Supervision avec JMX 85 / 125 MXBean ● Exemple de Standard MBean exposant une classe métier Contact ● Utilisation par le client public interface ContactServiceMBean { void addContact(Contact contact); List<Contact> getAllContacts(); Contact getContact(int id); } ... JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("antislashn.jmx:type=ContactService"); ContactServiceMBean contactService = JMX.newMBeanProxy(serverConnection, objectName, ContactServiceMBean.class); Contact c1 = contactService.getContact(1); ... La classe Contact est importée
  • 86. antislashn.org JBoss - Supervision avec JMX 86 / 125 MXBean ● Pour transformer le Standard MBean en XMBean, il faut implémenter une interface postfixée par MXBean au lieu de MBean public interface ContactServiceMBean { void addContact(Contact contact); List<Contact> getAllContacts(); Contact getContact(int id); } public interface ContactServiceMXBean { void addContact(Contact contact); List<Contact> getAllContacts(); Contact getContact(int id); }
  • 87. antislashn.org JBoss - Supervision avec JMX 87 / 125 MXBean ● Le client ne récupère plus une classe métier mais un CompositeType ● on interroge alors le CompositeType – par le nom des propriétés du type métier ● les collections sont transformées en tableaux JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("antislashn.jmx:type=MXContactService"); CompositeData[] liste = (CompositeData[]) serverConnection.getAttribute(objectName, "AllContacts"); for(CompositeData data : liste){ String name = (String) data.get("name"); int age = (int) data.get("age"); System.out.println("Contact : "+name+ " - "+age); } interrogation de l'attribut AllContacts du XMBean récupération des propriétés de l'objet métier par leur nom
  • 88. antislashn.org JBoss - Supervision avec JMX 88 / 125 Services de monitoring ● Permet d'observer les valeurs des attributs d'un MBean ● le MBean est l'objet observé ● le moniteur observe le MBean à intervalle régulier – en ms (granularity period) – une notification est envoyée lorsqu'une condition est satisfaite ● la condition varie en fonction du type de moniteur – le moniteur peut calculer une valeur par différence (derived gauge) ● pour les attributs numériques ● non activé par défaut – cf. méthode setDifferenceMode(boolean value)
  • 89. antislashn.org JBoss - Supervision avec JMX 89 / 125 Services de monitoring ● Trois moniteurs de surveillance sont fournis par défaut dans l'implémentation JMX
  • 90. antislashn.org JBoss - Supervision avec JMX 90 / 125 Services de monitoring ● Surveillance de comptage ● CounterMonitor ● observe l'augmentation d'un attribut entier d'un MBean – byte, short, int, long et classes associées – envoie une notification si la valeur de l'attribut observé dépasse une certaine valeur (threshold) ● possibilité de relancer la notification – setOffset(Number value) – mode de calcul par différence ● if (counter[t] - counter[t-GP]) is positive then V[t] = counter[t] - counter[t-GP] ● if (counter[t] - counter[t-GP]) is negative then V[t] = counter[t] - counter[t-GP] + MODULUS – GP => garnularity period
  • 91. antislashn.org JBoss - Supervision avec JMX 91 / 125 Services de monitoring ● Surveillance d'évolution ● GaugeMonitor ● observe un changement arbitraire d'un attribut numérique d'un MBean – int, long, float, double et classes associées – envoie une notification si la valeur dérivée ● passe au-dessus d'une limite haute (high threshold) ● passe en-dessous d'une limite basse (low threshold)
  • 92. antislashn.org JBoss - Supervision avec JMX 92 / 125 Services de monitoring ● Surveillance de chaîne de caractères ● StringMonitor ● observe un changement sur attribut de type String d'un MBean ● envoie une notification lorsque la valeur dérivée – est égale à une chaîne de caractère précise – diffère d'une chaîne de caractère précise
  • 93. antislashn.org JBoss - Supervision avec JMX 93 / 125 CounterMonitor - exemple ● Un MBean compteur change sa propre valeur sur un thread ● attribut Value ● Un CounterMonitor surveille se MBean ● Mise en place de la surveillance MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName compteurObjectName = new ObjectName("antislashn.jmx:type=Compteur"); CompteurMBean compteurMBean = new Compteur(); server.registerMBean(compteurMBean, compteurObjectName); ObjectName monitorObjectName = new ObjectName("antislashn.jmx:type=Monitor"); CounterMonitor monitor = new CounterMonitor(); monitor.addObservedObject(compteurObjectName); monitor.setObservedAttribute("Value"); … server.registerMBean(monitor, monitorObjectName); enregistrement du MBean Compteur enregistrement du CounterMonitor objet et attribut observé
  • 94. antislashn.org JBoss - Supervision avec JMX 94 / 125 CounterMonitor - exemple ● Signal généré par le CompteurMBean ● Stratégie mise en place ● période de surveillance : toute les secondes ● une notification est lancée si l'attribut est supérieur à 7 monitor.setGranularityPeriod(1000); monitor.setInitThreshold(7); monitor.setNotify(true); 0 100 10 s
  • 95. antislashn.org JBoss - Supervision avec JMX 95 / 125 CounterMonitor - exemple ● Signal généré par le CompteurMBean ● Stratégie mise en place ● période de surveillance : toute les secondes ● une notification est lancée si la valeur de l'attribut surveillé est supérieur à 7 monitor.setGranularityPeriod(1000); monitor.setInitThreshold(7); monitor.setNotify(true); 0 Integer.MAX_VALUE incrément de 1 toutes les 100 ms
  • 96. antislashn.org JBoss - Supervision avec JMX 96 / 125 CounterMonitor - exemple ● Signal généré par le CompteurMBean ● Stratégie mise en place ● période de surveillance : toute les secondes ● une notification est lancée si la valeur de l'attribut surveillé est supérieur à 7 monitor.setGranularityPeriod(1000); monitor.setInitThreshold(7); monitor.setNotify(true); 0 Integer.MAX_VALUE incrément de 1 toutes les 100 ms
  • 97. antislashn.org JBoss - Supervision avec JMX 97 / 125 CounterMonitor - exemple ● Signal généré par le CompteurMBean ● Stratégie mise en place ● période de surveillance : toute les secondes ● une notification est lancée si l'attribut est supérieur à 7 ● l'offset ajouté au threshold a chaque fois que la valeur sous surveillance est supérieure au threshold – permet de lancer plusieurs notifications monitor.setGranularityPeriod(1000); monitor.setInitThreshold(7); monitor.setOffset(5); monitor.setNotify(true); 0 Integer.MAX_VALUE incrément de 1 toutes les 100 ms
  • 98. antislashn.org JBoss - Supervision avec JMX 98 / 125 GaugeMonitor - exemple ● Signal généré par le CompteurMBean 0 100 10 s GaugeMonitor monitor = new GaugeMonitor(); monitor.addObservedObject(compteurObjectName); monitor.setObservedAttribute("Value"); monitor.setGranularityPeriod(10); monitor.setThresholds(7, 3); monitor.setNotifyHigh(true); monitor.setNotifyLow(true);
  • 99. antislashn.org JBoss - Supervision avec JMX 99 / 125 Timer Service ● Émetteur de notifications programmable ● intervalle fixe ● date donnée ● etc. ● Structure du service ● le service émet des TimerNotification
  • 100. antislashn.org JBoss - Supervision avec JMX 100 / 125 Timer Service ● Classe Timer ● utilise un thread secondaire ● méthode addNotification(...) – ajoute une notification à la file des notifications à envoyer – plusieurs signatures ● envoi d'une notification ● envoi période de notification ● envoi d'un nombre prédéfini de notification
  • 101. antislashn.org JBoss - Supervision avec JMX 101 / 125 Timer Service ● Utilisation du timer ● création d'une instance de Timer ● ajout d'une notification ● ajout d'un listener ● démarrage du timer Timer mBean = new Timer(); Date date = new Date(new Date().getTime()+Timer.ONE_SECOND*2); mBean.addNotification("antislashn.timer.test", "test 1", null, date); mBean.addNotification("antislashn.timer.test", "test 2", null, date,1000,10); mBean.addNotificationListener(new TimerNotificationListener(), null, null); mBean.start(); une notification sera envoyée à la date programmée 10 notifications seront envoyées, toutes les secondes, à partir de la date programmée
  • 102. antislashn.org JBoss - Supervision avec JMX 102 / 125 Monitoring de la JVM ● Plusieurs fonctionnalités ont été ajoutées depuis le JDK 1.5 ● la JVM est instrumentée avec des MBean ● existence d'une API de monitoring – permet d'obtenir des informations sur l'état de la JVM durant son exécution ● mémoire, threads, garbage collector, … – utilisable sous forme de MBean de type MXBean ● chaque MBean est identifié par son ObjectName ● ils implémentent l'interface PlatformManagedObject ● des méthodes la classe ManagementFactory permettent de récupérer directement les MXBeans
  • 103. antislashn.org JBoss - Supervision avec JMX 103 / 125 Monitoring de la JVM ● Exemple sur OperatingSystemMXBean OperatingSystemMXBean mxBean = ManagementFactory.getOperatingSystemMXBean(); System.out.println("Architecture : "+mxBean.getArch()); System.out.println("Nb de processeurs : "+mxBean.getAvailableProcessors()); System.out.println("Système d'exploitation : "+mxBean.getName()+" "+mxBean.getVersion()); System.out.println("Charge du système : "+mxBean.getSystemLoadAverage()); Architecture : x86 Nb de processeurs : 8 Systeème d'exploitation : Windows 7 6.1 Charge du système : -1.0 la charge n'a pas pu être calculée
  • 104. antislashn.org JBoss - Supervision avec JMX 104 / 125 Monitoring de la JVM ● Exemple sur RuntimeMXBean RuntimeMXBean rBean = ManagementFactory.getRuntimeMXBean(); System.out.printf("Boot classpath : %sn", rBean.getBootClassPath()); System.out.printf("classpath : %sn", rBean.getClassPath()); System.out.println("Input argument :"); List<String> arguments = rBean.getInputArguments(); for (String arg : arguments) { System.out.println(" " + arg); } System.out.printf("Library path : %sn", rBean.getLibraryPath()); System.out.printf("Management spec version : %sn", rBean.getManagementSpecVersion()); System.out.printf("Name : %sn", rBean.getName()); System.out.printf("Spec name : %sn", rBean.getSpecName()); System.out.printf("Vendor : %sn", rBean.getSpecVendor()); System.out.printf("Spec version : %sn", rBean.getSpecVersion()); System.out.printf("StartTime : %d msn", rBean.getStartTime());
  • 105. antislashn.org JBoss - Supervision avec JMX 105 / 125 Service JBoss – jusqu'à version 6 ● Les services sont des archives SAR déployés dans le répertoire de déploiement ● l'archive contient un fichier de description du service – META-INF/jboss-service.xml ● Le service créé doit utiliser les classes JBoss ● interface org.jboss.system.ServiceMBean ● classe org.jboss.system.ServiceMBeanSupport – fournit des méthodes de gestion du cycle de vie du service
  • 106. antislashn.org JBoss - Supervision avec JMX 106 / 125 Service JBoss – jusqu'à version 6 ● Diagramme de classe de l'exemple HelloService
  • 107. antislashn.org JBoss - Supervision avec JMX 107 / 125 Service JBoss – jusqu'à version 6 ● Code de l'exemple (extraits) public interface HelloServiceMBean extends ServiceMBean{ void setMessage(String message); String getMessage(); void sayHello(); } public class HelloService extends ServiceMBeanSupport implements HelloServiceMBean { private String message; @Override public void setMessage(String message) { this.message = message; } @Override public String getMessage() { return message; } ... }
  • 108. antislashn.org JBoss - Supervision avec JMX 108 / 125 Service JBoss – jusqu'à version 6 ● Contenu du fichier de déploiement ● META-INF/jboss-service.xml – cf. la DTD jboss-service_x_y.dtd (version x, release y) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE server> <server> <mbean code="org.antislashn.jmx.HelloService" name="antislashn.service:service=HelloService"> <attribute name="Message">Bonjour tout le monde</attribute> </mbean> </server> classe d'implémentation ObjectName du service initialisation de l'attribut Message
  • 109. antislashn.org JBoss - Supervision avec JMX 109 / 125 Service JBoss – jusqu'à version 6 ● Attributs les plus courants pour <mbean>  : ● <code> (obligatoire) : classe d'implémentation ● <name> (obligatoire) : JMX ObjectName du MBean ● <interface> : nom qualifié de l'interface, par défaut le nom de cette interface suit la spécification MBean
  • 110. antislashn.org JBoss - Supervision avec JMX 110 / 125 Service JBoss – jusqu'à version 6 ● Éléments fils les plus courants pour <mbean>  : ● <constructor (args*)> : spécifie un constructeur, si le constructeur par défaut n'est pas utilisé – <arg> : argument du constructeur, possède les attributs type et value ● <attribute> : permet l'initialisation d'un attribut du MBean ● <depends> : spécifie une dépendance vers un autre MBean ● Cf. la DTD pour une documentation exhaustive
  • 111. antislashn.org JBoss - Supervision avec JMX 111 / 125 Service JBoss – jusqu'à version 6 ● La console JMX de JBoss permet de vérifier la prise en compte du déploiement du service
  • 112. antislashn.org JBoss - Supervision avec JMX 112 / 125 Service JBoss – version 7 ● Deux stratégies de mise en place d'un service ● service JMX MBean – plus simple qu'avec les versions précédentes – pas besoin d'étendre les classes et interfaces JBoss ● les méthode start() et stop() seront automatiquement appelées – le fichier META-INF/jboss-service.xml référencie un schéma XML au lieu d'une DTD ● service EJB – ce n'est pas un service JMX – avec les annotations @Singleton et @Startup
  • 113. antislashn.org JBoss - Supervision avec JMX 113 / 125 Service JBoss – version 7 ● Exemple de service JMX public interface HelloServiceMBean { void setMessage(String message); String getMessage(); void sayHello(); } public class HelloService implements HelloServiceMBean { private String message; @Override public void setMessage(String message) {this.message = message;} @Override public String getMessage() {return message;} @Override public void sayHello() {System.out.println(">>> HelloService : "+message);} public void start() throws Exception {System.out.println(">>> CYCLE DE VIE HelloService start");} public void stop() {System.out.println(">>> CYCLE DE VIE HelloService stop");} }
  • 114. antislashn.org JBoss - Supervision avec JMX 114 / 125 Service JBoss – version 7 ● Exemple de fichier de déploiement ● META-INF/jboss-service.xml ● cf. le schéma pour plus de détails <?xml version="1.0" encoding="UTF-8"?> <server xmlns="urn:jboss:service:7.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:jboss:service:7.0 jboss-service_7_0.xsd"> <mbean code="org.antislashn.jmx.HelloService" name="antislashn.service:service=Hello,type=test"> <attribute name="Message">Hello, world</attribute> </mbean> </server>
  • 115. antislashn.org JBoss - Supervision avec JMX 115 / 125 Service JBoss – version 7 ● Le service est disponible dans la console JBoss, ainsi que par jconsole ou jvisualvm
  • 116. antislashn.org JBoss - Supervision avec JMX 116 / 125 Console en mode distant ● jconsole ou jvisualvm peuvent se connecter en mode distant ● côté serveur JMX il faut au moins lancer l'application Java avec l'indication du port utilisé ● lancer alors la console en mode "Remote Process" -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
  • 117. antislashn.org JBoss - Supervision avec JMX 117 / 125 Console en mode distant ● Activation du fichier des mots de passe ● deux fichiers sont nécessaires – fichier des droits d'accès ● par défaut : JRE_HOME/lib/management/jmxremote.acces ● définit les droits d'accès – fichier des mots de passe ● par défaut : JRE_HOME/lib/management/jmxremote.password ● définit les mots de passe ● le fichier modèle doit être renommé ● les fichiers doivent être en lecture seule – attention à l'héritage des droits sous Windows
  • 118. antislashn.org JBoss - Supervision avec JMX 118 / 125 Console en mode distant ● Activation du fichier des mots de passe ● si les fichiers utilisé ne sont pas sous JRE_HOME/lib/management il faut ajouter les arguments suivant à la JVM – ici les fichiers sont recherché dans le répertoire du projet ● En production il est préférable ● d'activer SSL ● d'utiliser JAAS pour l'authentification -Dcom.sun.management.jmxremote.access.file=jmxremote.access -Dcom.sun.management.jmxremote.password.file=jmxremote.password
  • 119. antislashn.org JBoss - Supervision avec JMX 119 / 125 Client personnalisé en mode distant ● Si le mode distant est sécurisé, il faut passer le rôle et le mot de passe au moment de la connexion ● extrait de code String[] credential = {"controlRole","titi"}; Map<String,String[]> env = new HashMap<String,String[]>(); env.put(JMXConnector.CREDENTIALS, credential); JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL,env); MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("antislashn.jmx:bean=Hello,type=standard"); HelloMBean mBean = JMX.newMBeanProxy(serverConnection, objectName, HelloMBean.class);
  • 120. antislashn.org JBoss - Supervision avec JMX 120 / 125 Console en mode distant – problèmes potentiels ● Gestion des droits sous Windows ● au lancement du serveur JMX l'erreur suivante apparaît ● il faut modifier les droits (click droit sur le fichier) Erreur: L'accès en lecture au fichier de mots de passe doit être limité: jmxremote.password cf page suivante
  • 121. antislashn.org JBoss - Supervision avec JMX 121 / 125 Console en mode distant – problèmes potentiels ● Gestion des droits sous Windows (suite) décocher cf page suivante
  • 122. antislashn.org JBoss - Supervision avec JMX 122 / 125 Console en mode distant – problèmes potentiels ● Gestion des droits sous Windows (suite) OK OK supprimer tous les utilisateurs sauf l'administrateur
  • 123. antislashn.org JBoss - Supervision avec JMX 123 / 125 Pour aller plus loin ● MXBean ● MBean permetant l'utilisation des types utilisateurs au travers des OpenType<T> ● OpenMBean – dynamique MBean utilisant les OpenType<T> ● M-Let service ● service de chargement dynamique des MBeans ● RelationService ● service de mise en relation des MBeans entre eux
  • 124. antislashn.org JBoss - Supervision avec JMX 124 / 125 Pour aller plus loin ● Les OpenType<T> ● décrit un type de donnée utilisé par les OpenMBeans et les MXBeans – SimpleType : type simple ● wrapper de type primitif, String, Date, ObjectName – CompositeType : type composé d'autres OpenType – TabularType : données tabulaires – ArrayType : données sous forme de tableau
  • 125. antislashn.org JBoss - Supervision avec JMX 125 / 125 Références ● Livres ● Java Management Extension – auteur : J. Steven Perry – éditeur : O'Reilly ● JMX – Managing J2EE with Java Management Extension – auteurs : Juha Lindfors, Marc Fleury, The JBoss Group – éditeur : SAMS ● Web ● http://docs.oracle.com/javase/7/docs/technotes/guides/jmx/JMX_1_4_specification.pdf ● http://www.jmdoudoux.fr/java/dej/chap-jmx.htm#jmx-12
  • 126. copyleft Support de formation créer par Franck SIMON http://www.franck-simon.com
  • 127. copyleft Cette œuvre est mise à disposition sous licence Attribution Pas d'Utilisation Commerciale Partage dans les Mêmes Conditions 3.0 France. Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-sa/3.0/fr/ ou écrivez à Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
  • 128. copyleft Support de formation créer par Franck SIMON http://www.franck-simon.com
  • 129. copyleft Cette œuvre est mise à disposition sous licence Attribution Pas d'Utilisation Commerciale Partage dans les Mêmes Conditions 3.0 France. Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-sa/3.0/fr/ ou écrivez à Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.