1. Prise en main de ProActive
- Récupérez l'archive tp-04-proactive.tar.gz
qui contient une version "allégée" de ProActive, ainsi que les fichiers squelettes du TP.
- Définissez la variable d'environnement
JAVA_HOME
contenant le chemin absolu
vers votre JDK. Exemple: export JAVA_HOME=/home/user/JDKs/jdk1.6.0_24
- Définissez la variable d'environnement
PROACTIVE_HOME
contenant le chemin absolu
vers ProActive. Exemple: export PROACTIVE_HOME=/home/user/tp-04-proactive/ProActive-5.0.1
- Vérifiez l'installation en lancant un exemple:
./ProActive-5.0.1/examples/nbody/nbody.sh
, choix 2
- Pour ce TP, vous aurez aussi besoin de la Javadoc.
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:
- les objets actifs
- le cycle de vie d'un objet actif
- le service asynchrone des requêtes
- les futures
Pour ce premier exemple, nous allons utiliser 3 classes, que nous compléterons:
-
tp4.Main
, qui va se charger de démarrer l'objet actif (tp4.CMAgent)
-
tp4.CMAgent
, l'objet actif
-
tp4.State
, un contenant pour les informations récoltées sur une machine
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:
- son constructeur,
- la
initActivity
,
- la
runningActivity()
,
- et lorsque
terminate()
est invoqué sur le Body, la endActivity
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.
|