JMX - Technologie pour le monitoring d'applications Java par Baptiste DERRÉ

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 :

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 :

Fluctuation de la Loire

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é :

Notification d'ouverture des vannes

Le niveau de la Loire augmente alors progressivement en aval jusqu'à dépasser le seuil maximum autorisé avant la crue :

Niveau de la Loire aval

Nous pouvons voir le timer de notifications démarrer et afficher des alertes périodiques :

Alerte de crue

Après avoir refermé les vannes, le niveau de la Loire redevient normal et le timer de notifications s'arrête.

Alerte de crue

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.