Master 1 Informatique Programmation Répartie et Architecture N Tiers
 

TD-TP - n°4 : ProActive

Durée: 3H

 
Denis Caromel, Brian Amedro
Université Nice-Sophia Antipolis, Département Informatique

1. Prise en main de ProActive

2. Un agent pour le monitoring

Nous allons maintenant développer un petit programme qui nous permettra d'obtenir quelques informations sur une machine distante tels que détails sur la mémoire de la JVM, le nombre processeurs disponibles sur la machine, le système d'exploitation présent, etc...
Nous verrons ainsi entre autres:

Pour ce premier exemple, nous allons utiliser 3 classes, que nous compléterons:

2.1. Création d'un objet actif

Q

Complétez la classe tp4.CMAgent de manière à ce que:

  • ProActive puisse la démarrer comme objet actif
  • Elle expose un service getCurrentState() qui retournera un objet State

Q

Complétez la méthode p4.Main.main(). N'oubliez pas d'utliser la Javadoc:

  • Démarrez l'objet actif en utilisant une methode static de org.objectweb.proactive.api.PAActiveObject
  • Appelez la méthode getCurrentState() et affichez le résultat
  • Étant donné que l'objet actif a une thread qui ne se termine jamis, ordonnez un arrêt explicite, toujours via une méthode de PAActiveObject
  • Vérifiez que cela fonctionne en lançant votre programme (note: votre CLASSPATH devra aussi contenir la librairie dist/lib/ProActive.jar
  • Retirez le implements Serializable dans la classe tp4.State et expliquez ce qu'il se passe lorsque vous relancez votre programme.

2.2. Cycle de vie d'un objet actif

Les objets actifs, comme leur nom l'indique, ont une activité propre, grâce à une thread interne.
Par défaut, la vie d'un objet actif passe par:

Il est possible de contôler ces phases d'initialisation, execution et fin, en implémentant les trois interfaces initActivity(), runActivity() et endActivity().
L'existance de initActivity se justifie par le fait qu'un objet actif nécessite l'existance d'un constructeur vide. La méthode initActivity est ainsi appelée automatiquement à la création de l'objet actif pour permettre de configurer l'objet sans utiliser le constructeur.
La méthode runActivity permet de gérer soi-même la queue des requête de l'objet actif
La méthode endActivity permet par exemple d'effectuer un "nettoyage" particulier avant que l'objet actif ne se termine.

Q

Nous allons implémenter ces trois méthodes pour mieux comprendre le fonctionnement d'un objet actif. Pour cela, éditez la classe tp4.CMAgentInitialized

  • Modifiez initActivity(Body body) pour afficher des informations sur la location au moment du départ et l'heure à laquelle l'objet actif a démarré
  • Modifiez endActivity(Body body) pour afficher des informations sur la location au moment de l'arrêt, calculer la durée totale d'execution, et afficher le nombre de requêtes servies.
  • Modifiez runningActivity(Body body) pour calculer le temps d'execution de la dernière requête et permettre le comptage de ces requête, en utilisant org.objectweb.proactive.Service.waitForRequest() et org.objectweb.proactive.Service.serveOldest().
  • Testez (sans oublier de modifier le main pour qu'il lance le bon objet actif)

2.3. Monitoring avancé avec IC2D

Nous allons maintenant tester les capacités de monitoring, et de migration de ProActive.

Q

Nous allons dans un premier temps modifier légèrement la méthode main pour rendre le monitoring plus intéressent.
Faites donc en sorte que getCurrentState() soit invoquée toute les 5 secondes, et ce pendant 1 minute.

Q

  • Lancez ./IC2D
  • Connectez-vous en SSH sur une autre machine et lancez un noeud ProActive au moyen de la commande ./bin/startNode.sh votre_nom. Vous obtiendrez alors une adresse du type : rmi://machine.unice.fr:16609/me/
  • Dans IC2D, "monitorez" ce noeud: clique droit dans la zone centrale, puis "Monitor a new host"
  • Lancez votre programme, et "monitorez" le aussi
  • Determinez où se trouve votre objet actif, et migrez-le avec la souris dans le noeud qui porte votre nom. Constatez les changements dans les logs.