Documente Academic
Documente Profesional
Documente Cultură
Java RMI
Plan
Java : RMI
Prsentation Exemple de base Exemple 2 : Agent mobile
B. Dupouy
26
29/11/06_______________________________
26
29/11/06_______________________________
ENST INFRES
ENST INFRES
Java RMI
Java RMI
Objectif
Prsentation Exemple de base Exemple 2 : Agent mobile Dfinir une architecture distribue qui s'intgre dans le langage de faon transparente, donc qui permette!: l'invocation de mthodes sur des objets situs sur des machines virtuelles diffrentes (cette invocation doit tre similaire une invocation locale) l'utilisation de l'environnement de scurit Java classique lors de l'excution d'applications distribues l'affranchissement du programmeur de la gestion de la mmoire, en dfinissant une extension distribue au garbage collecting
26
29/11/06_______________________________
26
29/11/06_______________________________
ENST INFRES
ENST INFRES
Java RMI
Java RMI
Un objet distant (Remote Object) est un objet dont les mthodes peuvent tre invoques par des clients situs sur des machines virtuelles distantes, Cet objet distant est manipul au travers d'une ou plusieurs interfaces, appeles Remote Interfaces qui contiennent les mthodes que les clients pourront invoquer sur ces objets distants, Une rfrence distante (Remote Reference) est une rfrence qui permet d'adresser un objet situ sur une machine virtuelle diffrente, Une invocation de mthode distante (Remote Method Invocation) invoque une mthode dfinie dans une interface d'objet distant. Elle a la mme syntaxe qu'une invocation de mthode locale.
!Les paramtres de type simple (int, ) sont passs par copie Les objets locaux sont srialiss (serializable) et passs par copie: diffrence avec le modle de Java, dans lequel les objets sont passs par rfrence, Les objets distants sont passs par rfrence : les mthodes sont bien excutes sur l'objet lui-mme, quelle que soit la machine virtuelle dans laquelle il rside Les mthodes distantes provoquent des exceptions supplmentaires : les clients doivent traiter des exceptions lies au caractre distribu des mthodes qu'ils invoquent, !Le bytecode n'est transmis la JVM qu'au moment de son utilisation
26
29/11/06_______________________________
26
29/11/06_______________________________
ENST INFRES
ENST INFRES
Java RMI
Java RMI
rmic
!Une fois qu'on a crit une classe qui implmente des interfaces, on cr le stub et le squelette correspondants grce rmic!: - ajout de _Stub au nom de la classe pour le stub, et _Skel pour le squelette (skeleton). - association de numros aux mthodes, Notes : l'option keepgenerated conserve les sources des stub et squelette Object contient une mthode getClass() qui donne la classe de l'objet : en ajoutant les suffixes adquats, on obtient les noms du stub et du squelette,
26
29/11/06_______________________________
26
29/11/06_______________________________
ENST INFRES
ENST INFRES
Java RMI
Java RMI
Remote signifie que les mthodes de cet objet Hello peuvent tre appeles depuis une JVM autre que la JVM locale. HelloServeur.java implmente cette interface!:
public class HelloServeur extends UnicastRemoteObject implements Hello
26
29/11/06_______________________________
26
29/11/06_______________________________
10
ENST INFRES
ENST INFRES
Java RMI
Java RMI
// Creation de l'objet qui va etre invoque par les clients HelloServeur MonServeur = new HelloServeur(); // // // // // // // On publie le service au serveur de noms : rmiregistry. La structure d'un nom est : machine:port/nom "machine" est le nom de la machine ou tourne le serveur et "nom" correspond au nom du service. "port" est le numero de port utilise par rmiregistry pour attendre les requetes destinees au service de noms.
myHostname machine = new myHostname(); String nomService = "//" + machine.QualifiedHost() + ":" + args[0] +"/HelloServeur"; Naming.rebind(nomService, MonServeur);
On rappelle l'interface :
public interface Hello extends java.rmi.Remote {
Aprs compilation du serveur, pour avoir le stub (HelloServeur_Stub.class)destin aux clients et le squelette (HelloServeur_Skel.class), il faut faire!: rmic HelloServeur
26
29/11/06_______________________________
11
26
29/11/06_______________________________
12
ENST INFRES
ENST INFRES
Java RMI
Java RMI
- les interfaces "prototypant" les mthodes distantes (extends java.rmi.Remote) - les objets qui les implmentent !Lancer : rmic : cration du stub et du squelette partir des fichiers .class des implmentations, rmiregistry : l'enregistrement des mthodes distantes sera fait lors de l'appel bind !Rendre accessibles par un serveur web les objets tlcharger (stubs, bytecode), COTE CLIENT : !l'appel lookup passera un stub au client
26
29/11/06_______________________________
13
26
29/11/06_______________________________
14
ENST INFRES
ENST INFRES
Java RMI
Java RMI
-server.codebase donne le nom du serveur web d'o les stubs seront tlchargs, -server.hostname donne le nom de la machine o se trouve le serveur -java.policy donne les droits d'accs qui seront vrifis par le security manager,voici le contenu de ce fichier :
grant { permission java.net.SocketPermission "*:1024-65535", "connect,accept"; permission java.net.SocketPermission "*:80", "connect";
};
26
29/11/06_______________________________
15
26
29/11/06_______________________________
16
ENST INFRES
ENST INFRES
Java RMI
Java RMI
Un "client" voulant acheter un produit va crer un agent au lieu d'interroger lui-mme tous les sites dtenteurs de magasins vendant le produit. L'agent donnera au "client" le nom du site qui propose le meilleur prix. Mise en oeuvre : Le client va lancer sa demande depuis un site appel "initiateur". Il initialise un tableau de sites parcourir, puis invoque distance sur le premier site la mthode migre, laquelle il a pass l'agent en argument.
Un "client" va envoyer un agent interroger successivement plusieurs serveurs (Hotes) On donne ci-dessous le circuit parcouru par l'agent :
Site Hote migre (Accs via stub) Hote (Transfert de code) Agent Agent (Transfert de code) (Accs via stub) Site Hote migre Hote
Remarquer les diffrents objets tlchargs!: - l'agent, simple bytecode, - le stub qui permet l'excution distante de la mthode migre
26
29/11/06_______________________________
17
26
29/11/06_______________________________
18
ENST INFRES
ENST INFRES
Java RMI
Java RMI
Le serveur
Le serveur excute la fonction migre pour le client : il rcupre alors le code de l'agent. Il le fait excuter par un thread et appelle lui-mme migre sur le site suivant :
Le serveur
Implmentation de l'interface (Hote_implem.java) : La mthode migre invoque distance cre un thread!: elle rend donc la main sans attendre la fin du traitement de l'agent (excution puis migration).
public class Hote_implem extends UnicastRemoteObject implements Hote
Hote
migre Hote
public Hote_implem(String fichier) throws RemoteException { super(); } public void migre(Agent a) { threadAgent monThread = new threadAgent(a, monMagasin);
monThread.start(); }
26
29/11/06_______________________________
19
26
29/11/06_______________________________
20
ENST INFRES
ENST INFRES
Java RMI
Java RMI
L'agent
Agent.java est l'interface pour les agents. L'objet sera implment par le "client" (initiateur).
import java.io.Serializable; public interface Agent extends Serializable { // Traitement effectue par l'agent sur chaque hote void traitement(); // Affiche le resultat des traitements : effectue par // l'agent lorsqu'il revient sur le site initiateur void afficheResultat(); // Renvoie le nom de l'hote suivant a visiter par l'agent String hoteSuivant(); }
threadAgent est le support systme offert par un Hote pour traiter un agent : cette classe dfinit le thread qui va tre lanc chaque fois qu'un agent arrive sur un Hote .
class threadAgent extends Thread public void run() // On effectue ici le traitement demande par l'agent // On fait ensuite migrer l'agent vers l'hote suivant Hote hote = (Hote) Naming.lookup(leSuivant); hote.migre(monAgent);
Serializable indique que les paramtres utiliss seront srialiss et normaliss lors de l'appel distant (marshalling).
26
29/11/06_______________________________
21
26
29/11/06_______________________________
22
ENST INFRES
ENST INFRES
Java RMI
Java RMI
L'initiateur
L'initiateur
Site Initiateur
Implmentation de l'initiateur, c'est dire du site "client" qui cr et lance l'objet vers les diffrents serveurs. La mthode migre est particulire : elle ne dclenche pas l'excution de l'agent mais lui demande d'afficher les rsultats obtenus.
public class Initiateur extends UnicastRemoteObject implements Hote public void migre(Agent a) { a.afficheResultat(); public static void main(String args[]) { agentIngredient agent = new agentIngredient(); hote.migre(agent);
-server.codebase donne le nom du serveur web d'o l'agent sera tlcharg, -server.hostname donne le nom de la machine o se trouve l'initiateur -le fichier java.policy donne les droits d'accs qui seront vrifis par le security manager
26
29/11/06_______________________________
23
26
29/11/06_______________________________
24
ENST INFRES
ENST INFRES
Java RMI
Java RMI
Annexe 1
Extraits de la fonction main d'un Hote
public class Hote_implem extends UnicastRemoteObject implements Hote public static void main(String[] args) System.setSecurityManager(new mySecurity()); // Creation de l'objet reparti et publication Hote monHote = new Hote_implem(args[0]); Naming.rebind("Hote", monHote);
Annexe 2
public class Initiateur extends UnicastRemoteObject implements Hote System.setSecurityManager(new mySecurity()); // Creation de l'objet reparti et publication monInitiateur = new Initiateur(); Naming.rebind("Initiateur", monInitiateur); // Recherche du nom de service du permier site // a visiter et obtention d'un stub String name = "//" + args[1] + "/Hote"; Hote hote = (Hote) Naming.lookup(name); // Creation de l'agentIngredient agentIngredient agent = new agentIngredient(); // Migration de l'agent hote.migre(agent);
Hote
26
29/11/06_______________________________
25
26
29/11/06_______________________________
26
ENST INFRES
ENST INFRES