JMX - Technologie pour le monitoring d'applications Java
TP : Gestion du barrage de Villerest avec JMX
Le barrage de Villerest est un barrage qui régule le débit de la Loire dans la région Rhône-Alpes. Nous allons créer une application pour empêcher une mauvaise gestion des vannes du barrage qui pourrait entraîner des crues sur les villes d'Orléans, Tours ou encore Nantes. Pour se faire, nous aurons deux utilisateurs :
- Un lecteur, par exemple le maire de la ville de Villerest qui pourra consulter le statut des vannes (ouvertes ou fermées) et la hauteur d'eau de la Loire en aval du barrage ;
- Un intervenant sur le barrage, par exemple la DREAL qui gère le barrage de Villerest.
Le code du serveur JMX
Nous définissons ces acteurs du système dans le fichier jmx_password.properties qui stocke les mots de passe comme ceci :
maire motdepasse1 dreal motdepasse2
Nous définissons également leurs droits dans un fichier jmx_access.properties:
maire readonly dreal readwrite
Nous allons ensuite avoir deux ressources. Une ressource "barrage" avec une classe Barrage.java se chargeant de l'ouverture des vannes du barrage. Nous aurons aussi une ressource "fleuve" avec une classe Fleuve.java qui relèvera le niveau d'eau en aval du barrage et qui aura un attribut définissant la hauteur maximale à ne pas dépasser et à partir de laquelle nous enverrons des notifications aux deux clients. Voici donc les deux MBeans correspondant respectivement à la classe Barrage.java et à la classe Fleuve.java
public interface BarrageMBean { String getNom(); String getNomFleuve(); boolean isVannesOuvertes(); void setVannesOuvertes(boolean vannesOuvertes); }
public interface FleuveMBean { String getNom(); float getHauteur(); float getHauteurMax(); }
Les classes Barrage.java et Fleuve.java implémentent alors ces interfaces. Nous allons maintenant dans ces classes utiliser le système de notification proposé par la technologie JMX. Nous allons émettre une notification à chaque fois que l'utilisateur dreal tentera d'ouvrir les vannes. Nous allons également créer un timer dans la classe Fleuve.java de façon à prévenir d'un dépassement du seuil maximum autorisé. Dans le setter de l'attribut vannesOuvertes de Barrage.java, nous allons définir une notification comme ceci :
@Override public void setVannesOuvertes(boolean vannesOuvertes) { nbChangementStatutVannes++; Notification n = new AttributeChangeNotification(this, nbChangementStatutVannes, System.currentTimeMillis(), "Modification du statut des vannes du barrage.", "boolean", this.vannesOuvertes, vannesOuvertes); sendNotification(n); this.vannesOuvertes = vannesOuvertes; }
Pour la notification de type timer dans la classe Fleuve.java, nous avons un attribut de type Timer. Nous allons dans le constructeur de Fleuve.java créer une instance de ce timer et nous lui ajouterons une notification avec la méthode addNotification de la classe Timer :
this.timer = new Timer(); timer.addNotification("Crue Imminente!", "La hauteur de la " + nom + " dépasse le seuil maximum (" + hauteurMax + " mètres), la crue est iminante! Ouvrir les vannes des barrages en aval!", null, new Date(), 5000, 0);
Ainsi, chaque fois que la hauteur d'eau en aval sera modifiée dans la classe Fleuve, nous vérifierons que celle-ci ne dépasse pas le seuil et, le cas échéant, nous émettrons des alertes toutes les 5 secondes.
public void setHauteur(float hauteur) { this.hauteur = hauteur; if (this.hauteur > hauteurMax) { if (!timer.isActive()) timer.start(); } else { if (timer.isActive()) timer.stop(); } }
Du côté client
Je vais maintenant présenter ce que l'on peut observer dans la jConsole du client. Pour le maire de Villerest, nous pourrons uniquement visualiser le niveau du barrage et la hauteur d'eau du fleuve ainsi que le statut ouvert ou fermé des vannes. Pour l'acteur dreal, il sera en plus de cela possible de modifier le statut des vannes.
Voici l'interface visible par le maire avec la jConsole. Les vannes du barrage sont fermées et le niveau de la Loire en aval du barrage fluctue entre 2 et 4 mètres environ :
L'utilisateur dreal va ensuite ouvrir les vannes du barrage pour laisser passer l'eau en amont du barrage. Le maire, qui avait cliqué préalablement sur le bouton "Subscribe" des notifications concernant l'ouverture des vannes voit apparaître une notification lui indiquant que le statut des vannes a été modifié :
Le niveau de la Loire augmente alors progressivement en aval jusqu'à dépasser le seuil maximum autorisé avant la crue :
Nous pouvons voir le timer de notifications démarrer et afficher des alertes périodiques :
Après avoir refermé les vannes, le niveau de la Loire redevient normal et le timer de notifications s'arrête.
Sources de l'application
Télécharger sources-barrage.zip (6304 octets)
Ce qu'il faut retenir
JMX permet de développer assez rapidement une simple architecture de supervision. En effet, un agent JMX se développe en quelques lignes de code et le client jConsole est déjà présent dans les binaires du JDK. Cette technologie peut permettre d'éviter de passer plusieurs heures à développer une architecture de supervision. Elle est aussi plus adaptée dans un environnement Java qu'une architecture SNMP.