Syst mes et Applications R partis
Java RMI
ENSI 2012/2013
Contenu de la pr sentation
q Introduction (Client-Serveur)
c Int r t des objets pour la construction dapplications r parties
c client-serveur objet
q Architecture de Java RMI
c Sch ma global, r le des talons
c Architecture, r le des couches RRL et transport
q Mode op ratoire
c Exportation de lobjet
c Service de nommage
c Codage : interface, serveur, client
c Compilation et activation
q Passage des param tres
c objet local, objet distant
q Appel en retour
q Chargement dynamique
q Activation dobjets distants
q Garbage collector
q Conclusion
2
Int r t des objets pour la construction dapplications
r parties
q Encapsulation
c Linterface (m thodes + attributs) est la seule voie dacc s l tat
interne, non directement accessible
q Classes et instances
c M canismes de g n ration dexemplaires conformes un m me
mod le
q H ritage
c M canisme de sp cialisation : facilite r cup ration et r utilisation de
lexistant
q Polymorphisme
c Mises en Suvre diverses des fonctions dune interface
c Remplacement dun objet par un autre si interfaces compatibles
c Facilite l volution et ladaptation des applications
ENSI
Syst mes et applications r partis
3
Client-serveur objet
q objets "langage"
repr sentation propre au
langage : instance d'une classe
exemple : Java RMI
q objets "syst me"
repr sentation "arbitraire"
d finie par l'environnement
d'ex cution
exemple : CORBA
q Motivations
propri t s de lobjet (encapsulation,
modularit , r utilisation, polymorphisme,
composition)
objet : unit de d signation et de
distribution
q El ments d'une "invocation"
r f rence d'objet
identification d'une m thode
param tres d'appel et de retour (y
compris signal d'exception)
" passage par valeur : types l mentaires et
types construits
" passage par r f rence
4
Appel de m thode distance
Remote Method Invocation (RMI)
q Solution propos e par SUN pour adapter le principe des RPC la
programmation orient e objet.
q Technologie fond e sur le langage Java ( partir du JDK 1.1)
q Localisation d'objets distants
q Les changes respectent un protocole propri taire : Remote Method Protocol.
q Invocation de m thodes sur des objets distants
q Transfert d'objets en param tres ou en retour (serialization)
ENSI
Syst mes et applications r partis
5
RMI : architecture logique
ENSI
Syst mes et applications r partis
6
La couche des r f rences distantes
q Plusieurs protocoles dinvocation possibles :
c Invocation point point (Unicast)
c Invocation vers des groupes de r plication (Multicast)
q Strat gie de reconnexion (si un objet devient inaccessible)
q Deux composantes coop rantes :
c la composante c t client (client-side)
c la composante c t serveur (server-side)
q Transmission de donn es entre couches transport par une
connexion orient e flux
ENSI
Syst mes et applications r partis
7
La couche transport
q La couche transport de Java-RMI effectue :
c Mise en place, gestion, surveillance de la connexion
c Ecoute des appels arrivants
c Maintien dune table dobjets distants pour lespace dadressage
c Localisation du dispatcher pour la cible dun appel distant et transmission de la
connexion
q Elle r alise les connexions r seaux bas es sur les flux entre les JVM.
q Elle emploie un protocole de communication propri taire (JRMP : Java
Remote Method Protocol) bas sur TCP/IP.
ENSI
Syst mes et applications r partis
8
Personnaliser la couche Transport des RMI
q Par d faut, TCP est utilis par la couche de transport RMISocketFactory (classes java.net.Socket et
java.net.SocketServer)
q Motivation
c utiliser dautres classes (que Socket et SocketServer) bas es sur
TCP pour de la compression, du chiffrage, &
Remarque : RMI over SSL utilise cette technique
ou non (UDP)
q Etape 1
c crire 2 sous classes de
java.rmi.RMIClientSocketFactory,
java.rmi.RMICServerSocketFactory
c qui utilisent 2 autres classes de transport que
java.net.Socket
Java.net. ServerSocket
q Etape 2
c Sp cifier les factories dans le constructeur de lobjet distant qui h rite de la classe UnicastRemoteObject
protected UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMICServerSocketFactory ssf)
ENSI
Syst mes et applications r partis
9
Appel de m thode distance
Remote Method Invocation (RMI)
objet client
objet serveur
Talon
client
Talon
serveur
Syst me de communication
tat
Methode_1
.
.
Methode_n
R f rence d'objet + m thode + arguments
R sultat ou exception
d signation
envoi de requ tes
ex cution de requ te
retour de r sultat
r f rence
appel
10
Java RMI
Mode op ratoire c t serveur
rmiregistry
Naming
Serveur
Skeleton
JVM Client
JVM Serveur
Client
11
Java RMI
Mode op ratoire c t serveur
q 1 - L'objet serveur s'enregistre aupr s du Naming de sa JVM
(m thode rebind)
q 2 - L objet skeleton est cr , celui-ci cr e le port de
communication et maintient une r f rence vers l'objet
serveur
q 3 - Le Naming enregistre l'objet serveur, et le port de
communication utilis aupr s du serveur de noms
q L'objet serveur est pr t r pondre des requ tes
12
Java RMI
Mode op ratoire c t client
rmiregistry
Naming
Client
Stub
JVM Client
13
Naming
Serveur
Skeleton
JVM Serveur
Java RMI
Mode op ratoire c t client
q4 - L'objet client fait appel au Naming pour localiser
l'objet serveur (m thode lookup)
q5 - Le Naming r cup re les "r f rences" vers l'objet
serveur, ...
q6 - cr e lobjet Stub et ...
q7 - rend sa r f rence au client
q8 - Le client effectue l'appel au serveur par appel
lobjet Stub
Publicité
14
q La souche client :
La souche client (stub)
cInitialise lappel vers un objet distant (via la couche des r f rences
distantes )
cS rialise les arguments sous forme dun unique flot de sortie
cInforme la couche des r f rences distantes que lappel peut tre
invoqu
cD s rialise le flot dentr e contenant la valeur de retour ou une
exception
cInforme la couche des r f rences distantes que lappel est achev
ENSI
Syst mes et applications r partis
15
La souche serveur (skeleton)
q La souche serveur :
cRe oit lappel par une m thode unique (aiguilleur)
cD s rialise le flot dentr e des arguments
cPr pare lappel vers limpl mentation r elle de lobjet distant
cDistribue lappel vers la bonne m thode cible
cS rialise les valeurs de retour ou les exceptions dans le flot de
sortie
ENSI
Syst mes et applications r partis
16
Exportation de l'objet
Pour exporter un objet :
q Utilisation de la classe UnicastRemoteObject
c L'objet reste alors actif et accessible en permanence
c Si la JVM dans laquelle il s'ex cute est arr t e, l'objet dispara t et sa r f rence
galement
q Variante possible : Activatable
c Permet de n'activer l'objet que quand il est sollicit
c Via un m canisme et une JVM particuliers
c Permet de limiter le nombre d'objets actifs en m me temps : gain de m moire
au besoin
c Plus complexe utiliser
ENSI
Syst mes et applications r partis
17
La classe UnicastRemoteObject
q Serveurs d marr s explicitement
q Utilise des comm TCP
q Pour des comm. P2P entre processus actifs
q Unicast : l'objet de la classe impl mentant l'interface n'existe quen
un seul exemplaire sur une seule machine
q L'objet meurt avec la fin de l'ex cution du serveur qui le lance
ENSI
Syst mes et applications r partis
18
La classe UnicastRemoteObject
q La classe abstraite RemoteObject red finit plusieurs m thodes de
Object et en ajoute pour les objets distants
c hashCode, equals, toString
c getRef, toStub, writeObject, readObject
q La classe abstraite RemoteServer d finit des m thodes
communes tous les serveurs
c unexportObject, getClientHost, &
q La classe UnicastRemoteObject impl mente les objets distants
non r pliqu s (mono-serveur)
c exportObject, &
ENSI
Syst mes et applications r partis
19
La classe UnicastRemoteObject
La principale fonction de cette classe se manifeste lors
de la cr ation dune instance de lobjet distant tendant
cette classe.
qLe constructeur cr e une instance de stub pour
lobjet et retourne ce stub comme r sultat de la
cr ation
qLe contenu dun stub
cUn stub contient essentiellement une variable ref de type
RemoteRef qui contient la localisation de lobjet (adresse
IP, port)
cUn appel de m thode se fait par appel de ref.invoke(&) qui
utilise les sockets pour la communication
ENSI
Syst mes et applications r partis
20
Le service de nommage: Enregistrement d'un
service
ENSI
Syst mes et applications r partis
21
Le service de nommage: Acc s une r f rence
distante
ENSI
Syst mes et applications r partis
22
Le service de nommage
q Une URL est form e pour l'enregistrement puis l'acc s sous la forme :
c rmi://<host_name>[:port]/
q Le port de liaison par d faut est le port TCP 1099
q La classe Naming encaspule le dialogue avec plusieurs objets serveurs
de liaison
c Peut utiliser un ou plusieurs registry par application distribu e
c On doit enregistrer un objet sur un registry local
c 5 op rations statiques pour enregistrer des objets et r cup rer leurs r f rences
ENSI
Syst mes et applications r partis
23
Le service de nommage
q L objet serveur de liaison
c r alise la correspondance nom avec stub
c Interface dun objet serveur de liaison
c Impl mentation par d faut de lobjet serveur de liaison
q La classe LocateRegistry
c localise ou active un objet serveur de liaison
c En g n ral invisible au client (appel en interne par Naming)
c M thodes Statiques
Registry createRegistry(int port)
cr e un objet serveur de liaison sur le port sp cifi
Registry getRegistry(int port)
r cup re lobjet serveur de liaison qui a t cr e
Registry getRegistry(server name, port number)
essaie de trouver un d mon rmiregistry sur la machine server name et sur le port port
ENSI
number
Syst mes et applications r partis
24
Le service de nommage
ENSI
Syst mes et applications r partis
25
La notion dinterface
q Linterface constitue le contrat - abstrait liant objets serveurs et
objets clients
cElle est destin e tre impl ment e par lOD et constitue la base
dappel pour les objets clients
Elle d finie les signatures (noms, types de retour, param tres) dun
ensemble de m thodes et seules ces m thodes seront accessibles par un
objet client
q Pour RMI, cest une interface Java traditionnelle & mais d rivant de la
classe java.rmi.Remote
ENSI
Syst mes et applications r partis
26
Java RMI
Manuel d'utilisation
q Codage
c Description de linterface du service
Ici pas dIDL s par : Java sert dIDL
c Ecriture du code du serveur qui implante linterface
c Ecriture du client qui appelle le serveur
q Compilation
c Compilation des sources (javac)
c Cr ation des Stub et Skel par rmic (faite automatiquement partir de JDK 5.0)
q Activation
c Lancement du serveur de noms (rmiregistry)
L'acc s une r f rence distante chez le client (par java.rmi.registry.Registry)
c Lancement du serveur
c Lancement du client
27
Java RMI
Manuel d'utilisation
q D finition de l'interface de l'objet r parti
c interface : "extends java.rmi.Remote"
c methodes : "throws java.rmi.RemoteException "
c param tres s rialisables : "implements Serializable "
q Ecrire une impl mentation de l'objet serveur
c classe : tend une des sous-classes de java.rmi.server.RemoteServer comme
java.rmi.server.UnicastRemoteObject
c Pas de sp cialisation et le constructeur doit ex cuter l'instruction suivante :
UnicastRemoteObject.exportObject(this);
q 5 Packages
c java.rmi : pour acc der des objets distants
c java.rmi.server : pour cr er des objets distants
c java.rmi.registry : li la localisation et au nommage dobjets distants
c java.rmi.dgc : ramasse-miettes pour les objets distants
c java.rmi.activation support pour l activation d objets distants.
28
Java RMI : criture de linterface
q M mes principes de base que pour linterface dun objet local
q Principales diff rences
c Linterface distante doit tre publique
c Linterface distante doit tendre linterface java.rmi.Remote
c Chaque m thode doit d clarer au moins lexception java.rmi.RemoteException
c Tout objet distant pass en param tre doit tre d clar comme une interface
(passage de la r f rence de lobjet)
c Tout objet local pass en param tre doit tre s rialisable
29
Java RMI
Exemple : Interface
fichier Hello.java
public interface Hello extends java.rmi.Remote
{
String sayHello() throws
java.rmi.RemoteException;
}
Description
de
l interface
30
Java RMI : criture du serveur
q Serveur = la classe qui impl mente linterface
cSp cifier les interfaces distantes qui doivent tre impl ment es
objets locaux pass s par copie (il doivent impl menter linterface
java.io.serializable)
objets distants pass s par r f rence (actuellement r f rence un stub)
cCest un objet java standard
d finir le constructeur de lobjet
fournir la mise en Suvre des m thodes pouvant tre appel es distance
ainsi que celle des m thodes napparaissant dans aucune interface
impl ment e
cCr er au moins une instance du serveur
cEnregistrer au moins une instance dans le serveur de nom (rmiregistry)
31
Java RMI : criture du serveur
q Lobjet distant servant peut tre dune sous classe de la classe
impl mentant linterface
Publicité
q Le serveur peut cr er et enregistrer plusieurs objets appartenant
une ou plusieurs classes
q Lenregistrement peut se faire aupr s de plusieurs rmiregistry
q Il faut pr voir une proc dure darr t (shutdown) du serveur
c Arr t des objets UnicastRemoteObject
public static void Naming.unbind(Stringname)
public static boolean UnicastRemoteObject.unexportObject(Remote,
boolean force)
ENSI
Syst mes et applications r partis
32
Java RMI
Exemple : Impl mentation de lobjet distant
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
fichier HelloObj.java
public class HelloObj extends UnicastRemoteObject implements Hello {
private String msg;
// Constructeur
public HelloObj(String msg) throws RemoteException {
this.msg = msg;
}
// Impl mentation de la m thode distante.
public String sayHello() throws RemoteException {
return "Hello world: " + msg;
R alisation
Du serveur
}
}
33
Java RMI
Exemple : Impl mentation de lobjet distant
fichier HelloObj.java
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloObj implements Hello {
private String msg;
// Constructeur
public HelloObj(String msg) throws RemoteException {
this.msg = msg;
UnicastRemoteObject.exportObject(this);
}
// Impl mentation de la m thode distante.
public String sayHello() throws RemoteException {
return "Hello world: " + msg;
}
}
34
R alisation
Du serveur
(autre approche)
Java RMI
Exemple : Serveur
fichier HelloServeur.java
import java.rmi.*;
public class HelloServeur {
public static void main(String args[]) {
try {
// Cr e une instance de l objet serveur.
HelloObj obj = new HelloObj("HelloServeur");
// Enregistre l'objet cr er aupr s du serveur de noms.
Naming.rebind(Hello.class.getName(), obj);
System.out.println("HelloServer" + " bound in registry");
R alisation
du
Serveur dobjets
} catch (Exception exc) {& }
}
}
ATTENTION : dans cet exemple le serveur de nom
doit tre activ avant la cr ation du serveur
35
Java RMI
Activation du serveur de nom par le serveur
fichier HelloServeur.java
public static void main(String args[]) {
int port; String URL;
try { // transformation d une cha ne de caract res en entier
Integer I = new Integer(args[0]); port = I.intValue();
} catch (Exception ex) {
System.out.println(" Please enter: Server <port>"); return;
}
try {
// Cr ation du serveur de nom - rmiregistry
Registry registry = LocateRegistry.createRegistry(port);
R alisation du
serveur
(autre approche)
// Cr ation d une instance de l objet serveur
HelloObj obj = new HelloObj("Coucou, je suis le serveur de port : "+port);
// Calcul de l URL du serveur
URL = "//"+InetAddress.getLocalHost().getHostName()+":"+port+
Hello.class.getName();
registry.rebind(URL, obj);
} catch (Exception exc) { ...}}
36
Java RMI
Exemple : Client
import java.rmi.Naming;
fichier HelloClient.java
public class HelloClient {
public static void main(String args[]) {
try {
// R cup ration d'un stub sur l'objet serveur.
Hello obj = (Hello) Naming.lookup("//suldrun/"+
Hello.class.getName());
// Appel d'une m thode sur l'objet distant.
String msg = obj.sayHello();
// Impression du message.
System.out.println(msg);
} catch (Exception exc) { & }
}}
R alisation
du
client
q On r cup re en fait une r f rence sur une instance de HelloObj_Stub
c Le talon local c t client qui sert de proxy pour l'acc s l'instance de HelloObj c t serveur
37
Java RMI
Exemple : Client (Recherche du rmiregistry)
fichier HelloClient.java
import java.rmi.Naming;
public class HelloClient {
public static void main(String args[]) {
try {
// R cup ration d'un stub sur l'objet serveur.
if (args.length > 0) obj = (Hello) LocateRegistry
.getRegistry(args[0]).lookup(Hello.class.getName());
else obj = (Hello)LocateRegistry.getRegistry()
.lookup(Hello.class.getName());
// Appel d'une m thode sur l'objet distant.
String msg = obj.sayHello();
// Impression du message.
System.out.println(msg);
} catch (Exception exc) { & }
}
}
38
R alisation
du
client
Java RMI
Compilation
qCompilation de linterface, du serveur et du client
cjavac Hello.java HelloObj.java HelloServeur.java
HelloClient.java
qG n ration des talons
cG n r s automatiquement partir du JDK 5.0
crmic HelloObj (JDK 1.4 ou ant rieur)
skeleton dans HelloObj_Skel.class
stub dans HelloObj_Stub.class.
Les fichiers .java g n r s sont effac s sauf si l'option -
keepgenerated est sp cifi e.
39
Java RMI
D ploiement
q 1) Activation du serveur de nom
c start rmiregistry (Windows) ou rmiregistry & (Unix)
q 2) Activation du serveur
c java HelloServeur
c L'ex cution d'un serveur RMI n cessite de fixer quelques propri t s:
L'h te et le chemin d'acc s des classes (de l'interface, ventuellement des impl mentations) du
serveur
-Djava.rmi.server.codebase=<repertoire>
Exemple :
java -Djava.rmi.server.codebase=http://hostname/& HelloServeur
-Djava.rmi.server.codebase=file://dev/hello/myclasses/
-Djava.rmi.server.codebase=file:/c:\dev\hello\myclasses/
path indiquant quel endroit la machine virtuelle cliente va pouvoir chercher le code du stub
Unix
Win32
-Djava.rmi.server.hostname=<hote>
N cessaire si le client et le serveur ne sont pas sur la m me station
Le fichier d finissant la politique de s curit
-Djava.security.policy=<fichier_policy>
q 3) Activation du client
c java HelloClient
40
Passage d'arguments
q Il y a 3 possibilit s de passage d'arguments lors de l'invocation d'une m thode
distante
c Le param tre est d'un type primitif : passage par valeur
c Le param tre est un objet
Il est s rialis et envoy au serveur
il doit donc impl menter java.io.Serializable ou java.io.Externalizable
Une r f rence distante est envoy e :cest lobjet Stub qui est s rialis et envoy
lobjet distant : quand lobjet distant invoque un m thode sur le param tre,
linvocation est distante.
Pour cela 3 conditions doivent tre respect es :
L'objet en question h rite de la classe UnicastRemoteObject;
Il impl mente une interface partag e avec l'autre partie (client ou serveur);
Sa r f rence distante (Stub) est accessible par l'autre partie.
q Idem pour la valeur de retour d'une m thode distante
ENSI
Syst mes et applications r partis
41
S rialisation d'objets
q La s rialisation est une op ration (on parle aussi de marshalling et
d'unmarshalling) qui consiste transformer un objet dans un format
transf rable par un flux de donn es (cf. les classes ObjectInputStream et
ObjectOutputStream du package java.io). On s'en sert principalement
dans 2 cas :
c Sauvegarder un objet dans un fichier
c D placer un objet d'une machine virtuelle vers une autre
q C'est donc une copie de l'objet qui est envoy e au serveur (ou au client
dans le cas d'une valeur de retour).
q Pour tre s rialisable, un objet doit impl menter l'interface
java.io.Serializable;
q Tous les objets contenus dans l'objet seront aussi s rialis s (ils doivent
donc tre aussi s rialisables);
q La s rialisation est effectu e automatiquement.
Publicité
ENSI
Syst mes et applications r partis
42
Java RMI
Passage en param tre dun objet local
Java VM
Java VM
O2
Objet objet1
m ( O2 )
clone_O2
Skeleton
R_objet1
Client
R_objet1.m ( O2 )
Stub
R_objet1
43
Java RMI
Passage en param tre dun objet local dont la classe est inconnue
du serveur
ENSI
Syst mes et applications r partis
44
Java RMI
Passage en param tre dun objet local dont la classe est inconnue
du serveur
ENSI
Syst mes et applications r partis
45
Java RMI
Passage en param tre dun objet local : exemple
ENSI
Syst mes et applications r partis
46
Java RMI
Passage en param tre dun objet distant
Objet O2
Java VM
Java VM
Client
R_objet1.m ( R O2 )
Stub
R_O2
Objet objet1
m ( R_objet )
Stub
R_objet1
47
Skeleton
R_objet1
Java RMI
Passage en param tre dun objet distant
Objet O2
Java VM
Java VM
Client
R_objet1.m ( R O2 )
Stub
R_O2
Objet objet1
m ( R objet )
Stub
R_O2
Stub
R_objet1
Skeleton
R_objet1
48
Java RMI
Passage en param tre dun objet distant
qSi jamais le type nest pas disponible
localement, il est charg dynamiquement
(RMIClassLoader)
qPour les param tres qui seraient d j des r f rences dOD,
lobjet amorce (Stub) est pass :
cimpossible de passer en param tre un objet
uniquement visible par les classes serveurs
ENSI
Syst mes et applications r partis
49
Java RMI
Passage en param tre dun objet distant
q M thode 1
c Le Stub est celui dun objet distant d j servi
q M thode 2 : Objet Distant Temporaire
cBut:
Lobjet distant est local au client et nest
utilis que pour la dur e dune ou
plusieurs invocations distantes depuis
le client
cSolution
Exporter lobjet avec la m thode
UnicastRemoteObject.exportObject()
Lobjet doit impl menter linterface Unreferenced
pour tre ramass par
le GC
ENSI
Syst mes et applications r partis
50
Objet Distant Temporaire : Le client
ENSI
Syst mes et applications r partis
51
Objet Distant Temporaire
Le serveur temporaire
ENSI
Syst mes et applications r partis
52
Objet Distant Temporaire
Lobjet distant et son serveur
ENSI
Syst mes et applications r partis
53
Objet Distant Temporaire
D roulement de lex cution
ENSI
Syst mes et applications r partis
54
Appels en retour
q La partie serveur peut avoir besoin d'appeler
une m thode sur la partie client
c Callback : appel en retour
q Deux moyens pour le serveur de conna tre le
client
c Rechercher sa r f rence via son nom dans
le registre
c R cup rer sa r f rence via l'appel de la
m thode
q Exemple : impl mentation du patron Observer
c Un l ment (l'observ ) g re une donn e/un
tat susceptible de changer
c D'autres l ments (les observateurs)
informent l'observ qu'ils veulent tre tenus
au courant des changements de valeur de la
donn e
ENSI
Syst mes et applications r partis
55
Appels en retour : Exemple
qInterface d'op rations, c t observateur
cUne op ration qui sera appel e par l'observ
quand la donn e observ e (un entier ici) changera
de valeur
ENSI
Syst mes et applications r partis
56
Appels en retour : Exemple
q Interface d'op rations c t observ
q Une m thode pour s'enregistrer comme observateur de la valeur et une
pour se d senregistrer
q Le param tre est de type IChangeValue
cC'est- -dire un objet impl mentant l'interface permettant de
signaler un changement de valeur
ENSI
Syst mes et applications r partis
57
Appels en retour : Exemple
q Impl mentation de l'observateur
ENSI
Syst mes et applications r partis
58
Appels en retour : Exemple
qImpl mentation de l'observ
ENSI
Syst mes et applications r partis
59
Appels en retour : Exemple
qImpl mentation de l'observ (suite)
ENSI
Syst mes et applications r partis
60
Appels en retour : Exemple
qLancement de l'observ
qLancement d'un observateur
ENSI
Syst mes et applications r partis
61
Appels en retour
q Note 1
c Quand un observateur appelle subscribe sur l'observ distant, il passe sa
r f rence distante car il impl mente une interface Remote
c L'appel de newValue se fait donc bien sur l'observateur distant (distant du
point de vue de l'observ qui appelle newValue)
q Note 2
c On peut noter que les observateurs ne se sont pas enregistr s via le registry
c On peut en effet communiquer avec un objet distant partir du moment o
il s'est export
c L'enregistrement via le registry n'est utile que pour r cup rer sa r f rence
partir de son nom associ
c Inutile ici car les observateurs passent eux-m mes leurs r f rences
l'observ
ENSI
Syst mes et applications r partis
62
Appels concurrents d'op rations
q Les m thodes de l'observ sont marqu es avec synchronized
cPour viter des incoh rences en cas d'appels concurrents
q C t servant
cEn interne de RMI, une op ration invoqu e dynamiquement ou par le
skeleton l'est dans un thread cr cet usage
cAcc s concurrent possible si plusieurs clients distants demandent en
m me temps ex cuter une op ration
cToujours avoir cela en t te quand on impl mente un servant m me si on
ne voit pas explicitement l'aspect concurrent
ENSI
Syst mes et applications r partis
63
Chargement dynamique des stubs
q Rappel : un objet client ne peut utiliser un objet distant quau
travers des stubs
Publicité
q RMI permet lutilisation des OD dont les stubs ne sont pas
disponibles au moment de la compilation
q A lex cution, RMI r clamera au serveur le stub client manquant et
le t l chargera dynamiquement (byte code)
cLe serveur est lanc en pr cisant un codebase
cLe client est lanc sans codebase et retrouvera les classes via les
informations envoy es par le registry
ENSI
Syst mes et applications r partis
64
Chargement dynamique des classes
q Plus g n ralement, le syst me RMI permet le chargement
dynamique de classes comme les stubs, les interfaces distantes
et les classes des arguments et valeurs de retour des appels
distants
q Cest un chargeur de classes sp cial RMI qui sen charge :
java.rmi.server.RMIClassLoader
ENSI
Syst mes et applications r partis
65
Charger des classes de mani re dynamique
q Les d finitions de classe sont h berg es sur un serveur Web.
q Les param tres, les stubs sont envoy s au client via une connexion
au serveur Web.
q Pour fonctionner, une application doit t l charger les fichiers de
classe.
Chargement dynamique
q Cela vite de disposer localement de toutes les d finitions de
classe.
q Les m mes fichiers de classe (m me version) sont partag s par tous
les clients.
q On ne charge que les classes dont on a besoin.
ENSI
Syst mes et applications r partis
66
Fichiers n cessaires si pas de chargement dynamique
qC t Client
qC t Serveur
linterface : Hello
le stub : HelloObj_Stub
le client : HelloClient
linterface : Hello
lobjet : HelloObj
le serveur dobjets :
HelloServeur
Le skeleton :
HelloObj_Skel
ENSI
Syst mes et applications r partis
67
Fichiers n cessaires si chargement dynamique
qC t client
qC t serveur
Le client : HelloClient
Le serveur HelloServeur
R cup rer les fichiers de classe partir du serveur web
Serveur Web : Interface : Hello
Stub : HelloObj_stub
Objet : HelloObj
ENSI
Syst mes et applications r partis
68
Le client peut tre lui m me dynamique
C t Client
q Le client : DynamicClient
q Chargement dynamique du client et
C t Serveur
q Le serveur dobjets :
HelloServeur
de linterface partir dun
r pertoire local. Si non disponibles
localement, ils sont recherch s sur
le serveur Web sp cifi .
q Lex cution de HelloClient permet
dobtenir la r f rence de lobjet
HelloObj et lappel distant de sa
m thode
q Chargement dynamique de
lobjet HelloObj partir du
serveur Web
q Enregistrement de lobjet dans
RMIregistry (bind)
q Attente de requ tes des clients
Serveur Web : Interface : Hello
Stub : HelloObj_stub
Objet : HelloObj
Client : HelloClient
ENSI
Syst mes et applications r partis
69
Principe du chargement dynamique
q A lenregistrement (dans rmiregistry) de l objet distant, le codebase est
sp cifi par java.rmi.server.codebase.
c URL est de type file , ftp ou http
c Exemples
$ java -Djava.rmi.server.codebase=file:///home/TPRMI/test-rmi/ Serveur
$ java -Djava.rmi.server.codebase=http://www.SAR.ensi.rnu.tn/TPRMI/test-rmi/ Serveur
q A lappel de bind(), le registre utilise ce codebase pour trouver les fichiers
de classe associ s lobjet.
q Le client recherche la d finition de classe du stub dans son classpath. Sil ne
la trouve pas, il essayera de la r cup rer partir du codebase.
c La m thode LoadClass de RMIClassLoader charge la classe partir du codebase
sp cifi .
q Une fois que toutes les d finitions de classe sont disponibles, la m thode
proxy du stub appelle les objets sur le serveur.
ENSI
Syst mes et applications r partis
70
Principe du chargement dynamique
ENSI
Syst mes et applications r partis
71
Principe du chargement dynamique :
L enregistrement de l objet
ENSI
Syst mes et applications r partis
72
Principe du chargement dynamique :
La r cup ration du Stub
ENSI
Syst mes et applications r partis
73
Principe du chargement dynamique :
Invocation d une m thode
ENSI
Syst mes et applications r partis
74
Les diff rentes tapes dun chargement dynamique
q crire les classes correspondant respectivement linterface et lobjet.
q Les compiler.
q G n rer le Stub correspondant lobjet.
q Installer tous les fichiers de classe sur un serveur Web.
q crire le serveur dynamique.
q Installer rmiregistry au niveau de la machine du serveur.
q Lancer le serveur en lui pr cisant lURL des fichiers de classe afin quil puisse
charger dynamiquement le fichier de classe correspondant lobjet, linstancier
(le cr er) et lenregistrer aupr s de rmiregistry.
q Sur la machine du client, crire le code du client.
q Compiler le client statique et linstaller ventuellement sur le site Web.
q Compiler le client dynamique et le lancer en pr cisant lURL des fichiers de classe.
ENSI
Syst mes et applications r partis
75
Chargement dynamique et s curit
q Si le code du stub nest pas pr sent sur le site local, le protocole RMI
pr voit le chargement dynamique du stub en utilisant un serveur
web et le protocole HTTP
c java -Djava.rmi.server.codebase=http://<hostname>/& HelloServeur
q Si chargement dynamique&
c le chargeur dynamique utilis par RMI (RMIClassLoader) regarde si la classe
demand e correspond au niveau de s curit requis
utilisation dun SecurityManager
Cest la classe java.rmi.RMISecurityManager
c cr er et installer le gestionnaire de s curit (dans le client)
System.setSecurityManager(new RMISecurityManager());
76
S curit et RMI
q L'ensemble des permissions accord es par ce SecurityManager sont d finies soit :
c en surchargeant certaines m thodes de l'instance (cf. la classe
java.lang.SecurityManager)
c en crivant un fichier externe indiqu dans l'option d'ex cution
-Djava.security.policy=<fichier_policy>
Example :
java -Djava.security.policy=client.policy HelloClient
q Syntaxe simplifi e d'un fichier policy :
grant {
permission <permission_class_name> [,action]
permission <permission_class_name> [,action]
...
};
ENSI
Syst mes et applications r partis
77
Exemples de fichiers policy
grant {
permission java.security.AllPermission;
};
grant {
permission java.io.FilePermission "/tmp/*",
"read,write";
permission java.util.PropertyPermission
"user.country", "read";
permission java.net.SocketPermission
"localhost:1099", "connect,accept,resolve";
};
ENSI
Syst mes et applications r partis
78
Exemple : serveur dynamique
fichier DynamicServer.java
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RMISecurityManager;
import java.rmi.server.RMIClassLoader;
import java.util.Properties;
import java.lang.reflect.Constructor;
public class DynamicServer {
public static void main(String[] args)
{
System.setSecurityManager(new RMISecurityManager());
try {
Properties p= System.getProperties();
String url=p.getProperty("java.rmi.server.codebase");
Class ClasseServeur = RMIClassLoader.loadClass(url, "HelloObj");
Constructor[] C = ClasseServeur.getConstructors();
Naming.rebind("rmi://sinus.rnu.ensi.tn:1099/MyHello",
(Remote)C[0].newInstance(new Object[]{args} ));
System.out.println("Objet Hel...