UE NSY107
Java RMI
CNAM Aquitaine
Eric Cariou
Universit de Pau et des Pays de l'Adour
UFR Sciences Pau Dpartement Informatique
[Link]@[Link]
1
Java RMI
Java intgre en natif deux middlewares de type RPC/RMI
Java RMI
Une mise en oeuvre de CORBA
Java RMI
Spcifique au langage Java : ne fait communiquer que
des lments crits en Java
Suit l'architecture et les rgles de fonctionnement des
middlewares de type RPC/RMI
Cas particulier du squelette cot serveur : depuis Java
1.2, plus besoin de squelette
L'appel de l'opration est fait via une invocation dynamique
Plus besoin d'identifier la mthode appeler en dcodant les donnes
reues (comme on l'a vu dans notre exemple de communication par
sockets)
2
Java RMI
Package [Link] et sous-packages
Packages contenant les classes utiliser ou spcialiser
pour des communications via RMI
Rgles principales suivre
Une interface d'oprations appelables distance doit
spcialiser l'interface [Link]
Une opration de cette interface doit prciser dans sa
signature qu'elle peut lever l'exception
RemoteException
Le servant implmente une interface spcialisant Remote
et doit spcialiser (ou utiliser des services de)
UnicastRemoteObject
Les classes des donnes en paramtres ou retour des
3
oprations doivent implmenter Serializable
Interface
Contraintes sur interface d'oprations
Spcialise [Link] : prcise qu'il s'agit d'une
interface de service appelables distance
Chaque opration doit prciser dans sa signature qu'elle peut
lever l'exception RemoteException
RemoteException est la classe mre d'une hirarchie d'une
vingtaine d'exceptions prcisant un problme lors de l'appel de
l'opration, comme, par exemple
L'opration peut galement lever des exceptions spcifiques l'application
NoSuchObjectException : ne peut rcuprer la ref sur l'objet distant
StubNotFoundException : un stub correct n'a pas t trouv
UnknowHostException : la machine distante n'a pas t trouve
AlreadyBoundException : le nom associ l'objet est dj utilis
ConnectException : connexion refuse par la partie serveur
Pour plus d'informations sur l'exception : opration
getCause() de RemoteException
Exemple d'interface
Exemple d'interface, dfinissant 2 oprations
public interface IRectangle extends Remote {
public int calculSurface(Rectangle rect)
throws RemoteException;
public Rectangle decalerRectangle(Rectangle rect,
int x, int y) throws RemoteException;
}
Les oprations sont quelconques, avec type de retour et
paramtres de types primitifs ou de n'importe quelle classe
Lors de l'implmentation des oprations de l'interface
On ne traite pas directement les cas d'erreurs correspondant la
leve d'une exception RemoteException
C'est le middleware/Java qui le fera cot client en cas
de besoin
Exemple d'interface
La classe Rectangle permet de dcrire les coordonnes
d'un rectangle
public class Rectangle implements Serializable {
public int x1, x2, y1, y2;
public Rectangle(int x1, int y1, int x2, int y2){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
public String toString() {
return "("+x1+","+y1+")("+x2+","+y2+")"; }
}
Note : les attributs sont publics par souci de simplification
6
Servant : exportation
La classe implmentant l'interface doit utiliser la
classe UnicastRemoteObject
Cette classe sert la communication via TCP
L'objet de la classe implmentant l'interface doit s'exporter pour
accepter des connexions de clients
Cration et utilisation des ressources, lments ncessaires la
communication via sockets TCP
Unicast : l'objet de la classe implmentant l'interface n'existe qu'un en
seul exemplaire sur une seule machine
L'objet meurt avec la fin de l'excution du serveur qui le lance
Deux modes
La classe tend directement la classe UnicastRemoteObject
Le constructeur par dfaut appele super();
Pas de spcialisation et le constructeur doit excuter l'instruction suivante :
[Link](this);
Le constructeur par dfaut doit prciser dans sa signature
qu'il peut lever RemoteException
7
Servant
Exemple pour l'interface IRectangle
public class RectangleImpl implements IRectangle {
public int calculSurface(Rectangle rect)
throws RemoteException {
return ((rect.x2 - rect.x1)*(rect.y2 - rect.y1)); }
public Rectangle decalerRectangle(Rectangle rect,
int x, int y) throws RemoteException {
return new Rectangle(rect.x1 + x, rect.y1 + y,
rect.x2 + x, rect.y2 + y);
}
public RectangleImpl() throws RemoteException {
[Link](this);
} }
Les oprations de l'interface sont standards, rien de particulier RMI
( part l'exception RemoteException dans la signature)
La classe peut implmenter d'autres oprations mais seules celles
d'interfaces tendant Remote sont appelables distance
Registry
Une partie client doit pouvoir rcuprer une rfrence sur
l'objet distant implmentant l'interface
Utilise les services du registry (registre, annuaire ...)
Le registry est lanc part cot des applis Java
Un objet accde au registry via la classe Naming
Identification d'un objet distant
Via une URL de la forme rmi://hote:port/nomObj
hote : nom de la machine distante (sur laquelle tourne un
registry)
port : port sur lequel coute le registry
nomObj : nom donn un objet offrant des oprations
Si pas prcision du port : port par dfaut utilis par le registry
Si pas prcision de l'hte : registry local par dfaut (localhost)
9
Registry
Lancement du registry
Unix/Linux : $ rmiregistry [port]
Windows : > start rmiregistry [port]
En paramtre, on peut prciser un numro de port : port d'coute
du registry
Par dfaut : 1099
Peut utiliser un ou plusieurs registry par application distribue
On doit enregistrer un objet sur un registry local
Variante de lancement : un objet Java peut l'excution
lancer un registry
Opration de [Link]
public static Registry createRegistry(int port)
throws RemoteException
Lance un registry localement sur le port d'coute pass en
paramtre
10
Registry
Classe [Link]
5 oprations statiques pour enregistrer des objets et rcuprer
leurs rfrences (lvent toutes plusieurs exceptions voir API)
void bind(String name, Remote obj)
void rebind(String name, Remote obj)
Retourne l'ensemble des noms des objets enregistrs sur le registry
Remote lookup(String name)
Supprime du registry la rfrence vers l'objet nomm name
String[] list(String name)
Enregistre un objet sous le nom name, en crasant la prcdente liaison
objet/nom si elle existait
void unbind(String name)
Enregistre un objet sous le nom name (erreur si dj un objet avec ce nom)
Retourne une rfrence sur l'objet dont le nom est pass en paramtre
Exception NotBoundException leve si objet pas trouv par le registry
Attribut name dans les 5 oprations : sous la forme URL
de type RMI
11
Gnration stub/squelette
Pour pouvoir appeler les oprations distance, il
faut gnrer le stub (talon)
Et le squelette avant la version 1.2 de Java
Utilitaire : rmic
Pour notre exemple : $ rmic RectangleImpl
On passe en paramtre rmic le nom de la classe qui
implmente l'interface (ou les interfaces)
Gnre et compile automatiquement le fichier
RectangleImpl_Stub.java
(option -keep de rmic pour conserver les sources Java)
Pas de manipulation directe dans notre code de ce fichier
Dans notre exemple avec les sockets, on avait crit l'quivalent
du talon (ainsi que du squelette) la main
12
Exemple cot serveur
Cot serveur : instantiation d'un RectangleImpl et
enregistrement sur le registry
try
{
// instantiation standard de l'objet
RectangleImpl rect = new RectangleImpl();
// enregistrement de l'objet sous le nom opRect sur le registry local
[Link]("opRect",rect);
}
catch (Exception e)
{ ... }
Avant d'excuter ce code : lancer rmiregistry
On suppose que le serveur et le registry sont lancs sur la
machine scinfr222 avec le port par dfaut pour le registry
13
Exemple cot client
Code client client pour appeler les oprations distantes
(exceptions grer en plus)
Rectangle r1, r2;
r1 = new Rectangle(10, 10, 20, 30);
// on demande au registry tournant sur la machine scinfr222 (port par dfaut)
// de nous renvoyer la rf de l'objet nomm opRect
IRectangle opRectangle = (IRectangle)
[Link]("rmi://scinfr222/opRect");
// une fois la rfrence obtenue, on appelle normalement les oprations
// de l'interface sur cet objet (en catchant RemoteException)
int surface = [Link](r1);
r2 = [Link](r1, 15, 10);
[Link](" surface de r1 = "+surface);
[Link](" position de r2 = "+r2);
14
Exemple cot client
Rsultat du lookup
Si objet trouv par le registry distant, retourne un objet
implmentant l'interface gnrique Remote
En pratique ici : un objet implmentant IRectangle
Comme par exemple RectangleImpl instantie cot serveur
On rcupre en fait une rfrence sur une instance de
RectangleImpl_Stub
Le talon local cot client qui sert de proxy pour l'accs l'instance de
RectangleImpl cot serveur
Pour simplifier, on fait le cast avec IRectangle
Pas besoin de savoir l'instance de quelle classe exactement on
manipule
15
Objets distribus
Principe d'interaction entre objets Java
Un objet possde des rfrences sur d'autres objets
Lors d'appels de mthodes
Passage de rfrences sur des objets
Sauf pour types primitifs : passage par valeur
Java RMI : objets distribus
Etend la notion de rfrence (locale par dfaut) des rfrences
distantes
On peut alors appeler des mthodes sur un objet distant ou passer des
rfrences d'objets distants lors d'appels de mthodes
A condition que l'on puisse appeler des mthodes sur ces objets
distance donc que cet objet implmente une interface remote et se
soit export
Contraintes / limites
Un objet est pass par rfrence quand cela est possible
Pour tous les autres objets / types, on utilise un passage par valeur16
Passage des paramtres/donnes
Lors d'appel de mthodes distantes : 4 cas pour grer les
paramtres ou la valeur retourne selon la classe
Si classe implmente Remote : passage par adresse
On passe ou rcupre la rfrence sur un objet distant
Si classe n'implmente pas Remote : passage par valeur
L'objet est clon, on passe ou rcupre une copie de l'objet
La classe doit forcment implmenter Serializable
Car pour un passage par valeur, les objets sont forcment srialiss pour
tre transmis via le rseau (via des sockets)
Si classe n'implmente ni Serializable ni Remote : ne peut pas
tre paramtre ou type de retour
Pour types primitifs : passage par valeur comme en local
Note
A cause de la duplication d'objet, faire encore plus attention quand on
compare 2 objets entre l'galit de rfrence = et l'galit de contenu
(appel de equals)
Penser encore plus redfinir equals dans vos classes
17
Appels en retour
On a vu dans l'exemple prcdent
Une partie client appelant une mthode sur une partie
serveur
Mais la partie serveur peut avoir besoin d'appeler une
mthode sur la partie client
Callback : appel en retour
Deux moyens pour le serveur de connatre le client
Rechercher sa rfrence via son nom dans le registre
Rcuprer sa rfrence via l'appel de la mthode
Note sur les termes partie serveur et partie client
Diffrence entre appelant et appel de l'opration
Chaque lment peut jouer les 2 rles indiffremment
18
Appels en retour
Exemple : implmentation du patron Observer
Un lment (l'observ) gre une donne/un tat
susceptible de changer
D'autres lments (les observateurs) informent l'observ
qu'ils veulent tre tenus au courant des changements de
valeur de la donne
Interface d'oprations, cot observateur
Une opration qui sera appele par l'observe quand la
donne observe (un entier ici) changera de valeur
public interface IChangeValue extends Remote {
public void newValue(int value)
throws RemoteException;
}
19
Appels en retour
Interface d'oprations cot observ
public interface ISubscription extends Remote {
public void subscribe(IChangeValue obs)
throws RemoteException;
public void unsubscribe(IChangeValue obs)
throws RemoteException; }
Une mthode pour s'enregistrer comme observateur de
la valeur et une pour se dsenregistrer
Le paramtre est de de type IChangeValue
C'est--dire un objet implmentant l'interface permettant de
signaler un changement de valeur
20
Appels en retour
Implmentation de l'observateur
public class Observer extends UnicastRemoteObject
implements IChangeValue {
// mthode qui sera appele par l'observ distant
public void newValue(int value) throws RemoteException {
[Link](" nouvelle valeur : "+value);
}
// mthode appeller pour s'enregistrer auprs de l'observ
public void subscribeToObservee() {
try {
ISubscription sub = (Isubscription)
[Link]("rmi://scinfe222/observee");
[Link](this); }
catch (Exception e) { ... } }
// constructeur qui appelle super pour exporter l'objet
public Observer() throws RemoteException {
super(); }
}
21
Appels en retour
Implmentation de l'observ
public class Observee extends UnicastRemoteObject
implements Isubscription {
// liste des observateurs
protected Vector observerList;
// donne observe
protected int value = 0;
// enregistrement d'un observateur distant
public synchronized void subscribe(IChangeValue obs)
throws RemoteException {
[Link](obs);
}
// dsenregistrement d'un observateur distant
public synchronized void unsubscribe(IChangeValue obs)
throws RemoteException {
[Link](obs);
22
}
Appels en retour
Implmentation de l'observ (suite)
// mthode appele localement quand la donne change de valeur
public synchronized void changeValue(int newVal) {
value = newVal;
IChangeValue obs;
// on informe tous les observateurs distants de la nouvelle valeur
for (int i=0; i<[Link](); i++)
try {
obs = (IChangeValue)[Link](i);
[Link](value); }
catch(Exception e) { ... }
}
// on exporte l'objet et initialise la liste des observateurs
public Observee() throws RemoteException {
super();
observerList = new Vector(); }
}
23
Appels en retour
Lancement de l'observ
Observee obs = new Observee();
[Link]("observee", obs);
for (int i=1; i<=5; i++) {
[Link](i*10);
[Link](1000);
}
Lancement d'un observateur
Observer obs = new Observer();
[Link]();
// partir de l, l'objet observateur sera inform des changements
// de valeur via l'appel de newValue
24
Note 1
Appels en retour
Quand un observateur appelle subscribe sur l'observ
distant, il passe sa rfrence distante car il implmente
une interface Remote
L'appel de newValue se fait donc bien sur l'observateur distant
(distant du point de vue de l'observ qui appelle newValue)
Note 2
On peut noter que les observateurs ne se sont pas enregistrs
via le registry
On peut en effet communiquer avec un objet distant partir du
moment o il s'est export
L'enregistrement via le registry n'est utile que pour rcuprer sa
rfrence partir de son nom associ
Inutile ici car les observateurs passent eux-mmes leurs
rfrences l'observ
25
Appels concurrents d'oprations
Les mthodes de l'observateur sont marques avec
synchronized
Pour viter des incohrences en cas d'appels concurrents
Cot servant
En interne dans RMI, une opration invoque
dynamiquement ou par le squelette l'est dans un thread
cr cet usage
Accs concurrent possible si plusieurs clients distants
demandent en mme temps excuter une opration
Toujours avoir cela en tte quand on implmente un
servant mme si on ne voit pas explicitement l'aspect
concurrent
26
Mobilit de code
Rfrence sur un objet distant
En ralit une rfrence sur un stub local qui implmente
la mme interface d'oprations que l'objet distant
Mme si la classe du stub n'apparat pas explicitement
dans le code, elle doit pouvoir tre retrouve l'excution
Contraintes d'une application distribue
Les diffrents objets ne s'excutent pas dans les mmes JVM ni
sur les mmes machines : accs aux .class peuvent diffrer
Malgr cela, on doit pouvoir cot client rcuprer la classe du stub
2 modes pour rcuprer la classe du stub de l'objet distant
Localement, la classe se retrouve via le CLASSPATH
A distance, en tlchargeant la classe partir d'un
emplacement prcis
27
Mobilit de code
Une proprit de Java permet de prciser une URL
o aller tlcharger les classes requises
[Link], positionner en lanant
le programme Java
URL est de type file, ftp ou http
Exemples
$ java -[Link]=[Link]
ecariou/test-rmi/ Serveur
$ java -[Link]=[Link] Serveur
Problme potentiel du tlchargement de code
Scurit : ne doit pas pouvoir par dfaut tlcharger n'importe
quelle classe de n'importe o
28
Mobilit de code
Gestion de la scurit
Il n'est pas possible de tlcharger des classes sans
mettre en place un security manager
Classe [Link]
Permet de prciser les permissions pour l'accs aux fichiers, au
rseau, la rflexion sur les objets, la srialisation ...
Classe spcialiser pour prciser les permissions selon le
contexte
Pour RMI, il existe une spcialisation :
[Link]
Trs restrictif par dfaut : interdit notamment le tlchargement
de classe et peu prs tout le reste aussi ...
29
Mobilit de code
Gestion de la scurit (suite)
Avec RMI, deux faons d'ouvrir les restrictions
Utiliser une spcialisation maison de SecurityManager la place de
RMISecurityManager
Utiliser RMISecurityManager avec en plus un fichier dcrivant la
politique de permissions : fichier policy
Exemple, en donnant toutes les permissions
A viter en pratique si on veut bien grer l'aspect scurit !
Fichier [Link]
grant {
permission [Link];
};
Spcialisation de SecurityManager
public class SecurityManagerOuvert extends SecurityManager{
public void checkPermission(Permission perm) { }
}
30
Mobilit de code
Gestion de la scurit (suite)
Pour installer un gestionnaire de scurit, excuter le
code suivant
[Link](new RMISecurityManager()));
Pour utiliser un fichier policy, positionner la proprit
[Link] au lancement du programme
$ java -[Link]=[Link]
Serveur
Ces permissions sont positionner pour les programmes
qui tlchargeront les classes, inutiles pour les autres
Comment positionner des permissions plus prcises ?
Assez complexe apprhender et comprendre...
Voir les documentations spcialises ce sujet
31
Mobilit de code
Fonctionnement gnral pour rcuprer le stub cot client
Quand serveur enregistre un objet sur le registry, le registry doit
pouvoir rcuprer la classe du stub distant pour l'associer l'objet
Soit le serveur est lanc avec un codebase positionn et le registry
va l'y chercher
Soit le registry la trouve en local (registry lanc du mme rpertoire
que le serveur par exemple)
Quand un client demande rcuprer la rfrence sur un objet
Le registry lui envoie le nom de la classe du stub et le codebase
associ (sauf si le registry a trouv la classe en local, il envoie pas de
codebase)
Si le client trouve cette classe via son CLASSPATH, c'est celle l qui est
choisie en priorit
Sinon, il la rcupre via le codebase envoy par le registry
Si on lui avait pass en paramtre un codebase son lancement, il la
cherche galement cet endroit
Le client instantie la classe du stub, l'instantie dynamiquement et
utilise cette instance pour accder l'objet distant
32
Mobilit de code
Rcupration des stubs, principaux cas (modulables
entre eux)
Les parties serveurs et clients ont accs aux bonnes classes
via leur CLASSPATH
Dynamique cot client
Pas besoin de prciser de codebase, tout sera charg localement
Le serveur est lanc en prcisant un codebase
Le client est lanc sans codebase et retrouvera les classes via
les informations envoyes par le registry
Dynamique cot serveur
Le client est lanc en prcisant un codebase
Le serveur, en cas d'appel en retour par exemple, rcupre les
stubs cot client via ce codebase
33
Mobilit de code
Mobilit de code
Ne concerne pas que les stubs
Toute classe ncessaire au bon fonctionnement de
l'application peut-tre tlcharge au besoin
Exemple : variante de l'exemple avec les rectangles
La classe Rectangle2 spcialise Rectangle
public class Rectangle2 extends Rectangle {
public Rectangle2(int x1, int y1, int x2, int y2){
super(x1, y1, x2, y2);
}
}
34
Mobilit de code
Exemple (suite)
L'interface est inchange : IRectangle
Cot servant, on modifie decaleRectangle() pour
renvoyer une instance de Rectangle2
public class RectangleImpl implements IRectangle {
(...)
public Rectangle decalerRectangle(Rectangle rect,
int x, int y) throws RemoteException
{
return new Rectangle2(rect.x1 + x, rect.y1 + y,
rect.x2 + x, rect.y2 + y);
}
(...)
35
Exemple (suite)
Mobilit de code
La partie client ([Link]) va tlcharger les classes
dynamiquement
Elle doit donc positionner un security manager pour commencer
// positionne le security manager acceptant tout
[Link](new SecurityManagerOuvert());
Rectangle r1, r2;
r1 = new Rectangle(10, 10, 20, 30);
IRectangle opRectangle = (IRectangle)
[Link]("rmi://scinfe222/opRect");
r2 = [Link](r1, 15, 10);
[Link]("classe de IRectangle = "
+[Link]());
[Link]("classe de r2 = "+[Link]());
36
Mobilit de code
Exemple (suite)
Le serveur ([Link]) est lanc en prcisant un
codebase pour accder aux classes requises
Il instantie un RectangleImpl et l'enregistre auprs du registry
$ java -[Link]=[Link] Serveur
Le registry est lanc d'un rpertoire quelconque (et pas
celui o se trouvent les classes)
Le client est lanc sans avoir accs via son CLASSPATH
aux bonnes classes (RectangleImpl et Rectangle2)
$ java Client
Ce qui affiche le rsultat suivant
classe de IRectangle = class RectangleImpl_Stub
classe de r2 = class Rectangle2
37
Mobilit de code
Exemple (fin)
Les classes RectangleImpl et Rectangle2 ont donc
t rcupres par le client en les tlchargeant l'URL
[Link]
Note
Si l'excution des exceptions UnmarshallException,
AccessDeniedException ou ClassNotFoundException
sont leves
Correspond souvent des tentatives de tlchargement de
classes mais sans avoir les permissions suffisantes ou sans
savoir o aller les rcuprer
Si c'est du cot serveur : le registry n'arrive pas rcuprer le
stub, le codebase a t oubli cot serveur
38
Mobilit de code
En conclusion, pour bien grer l'accs aux classes,
2 grands modes
S'arranger pour qu' la fois le client et le serveur aient
accs toutes les classes via leur CLASSPATH
Lancer systmatiquement le serveur avec le codebase et
le client avec un scurity manager pour pouvoir
tlcharger les classes au besoin
En lanant le registry sans qu'il ait directement accs aux classes
Note
Ne pas oublier de prendre en compte les packages
Et donc de remonter ventuellement dans l'arborescence pour
prciser le codebase
39
Garbage collector distribu
Dans la plupart des mises en oeuvre de langages
objets : garbage collector
Ramasse miette en franais
But : supprimer de la mmoire locale (du programme, de
la JVM en Java) les objets n'tant plus rfrencs par
aucun autre objet
Objets distribus (via un middleware comme Java
RMI)
Capacit rfrencer des objets distants comme des
objets locaux
Pour nettoyage des objets non rfrencs : doit alors
prendre aussi en compte les rfrences distantes
Distributed Garbage Collector (DGC)
40
Garbage collector distribu
Fonctionnement gnral d'un garbage collector (en
local)
Un compteur de rfrence est associ chaque objet
Quand un objet rcupre une rfrence sur l'objet, on
incrmente de 1 le compteur de cet objet
Quand un objet ne rfrence plus l'objet, on dcrmente le
compteur de 1
Quand compteur a pour valeur 0, on peut supprimer l'objet
de la mmoire car plus aucun objet ne l'utilise plus
En distribu peut utiliser un fonctionnement similaire
En prenant en compte la fois les rfrences locales et
distantes
41
Garbage collector distribu
Contraintes supplmentaires en distribu
Coordination entre garbages collectors sur chaque
machine pour assurer gestion des rfrences
Rfrence sur un objet distant = rfrence locale sur un proxy
pour cet objet
Quand localement un proxy n'est plus rfrenc par aucun objet,
on peut informer le GC grant l'objet distant de la perte de
rfrence
Si une machine distante est plante ou est inaccessible
Ne pourra pas prciser un GC que l'objet n'est plus rfrenc
Solution : utiliser une dure de bail (lease)
Si au bout d'un certain temps, un objet distant n'a pas utilis un
objet local, localement, on considre que l'objet distant ne
rfrence plus l'objet local
42
Garbage collector
Java RMI gre un garbage collector distribu
En local, pour effectuer des actions avant la destruction
d'un objet
Redfinition de la mthode finalize() de [Link]
Pour la gestion des rfrences distantes
Interface [Link] dfinissant :
public void unreferenced()
Cette interface peut tre implmente par un objet offrant des
oprations appellables distance
L'opration unreferenced est appele quand plus aucun objet
distant ne possde de rfrence sur l'objet courant
Ce que l'on peut faire par exemple dans cette mthode :
dsexporter l'objet : unexporteObject(this, true);
43
Garbage collector
Le garbage collector distribu de RMI gre une
dure de bail
Proprit [Link]
Le bail est de 10 minutes par dfaut
Pour le modifier, on peut le faire au lancement du
programme
$ java -[Link]=20000 Serveur
La dure est prcise en milli-secondes, 20 secondes donc ici
Note
Ne pas oublier que le registry possde aussi une
rfrence sur l'objet si ce dernier a t enregist dans le
registry
44
Exportation de l'objet
Pour exporter un objet, on a vu la classe
UnicastRemoteObject
L'objet reste alors actif et accessible en permanence
Si la JVM dans lequel il s'excute est arrte, l'objet
disparat et sa rfrence galement
Variante possible : Activable
Permet de n'activer l'objet que quand il est sollicit
Via un mcanisme et une JVM particulers
Permet de limiter le nombre d'objets actifs en mme
temps : gain de mmoire au besoin
Plus complexe utiliser : voir documentation spcialise
45
Gestion des firewalls
Elment important dans la construction de toute
application distribue
Prendre en compte les ventuels firewalls pouvant
empcher des communications distances
Plusieurs solutions en RMI, dont l'encapsulation
des communications dans des paquets HTTP
Tunneling HTTP
Evite le filtrage sur les ports non standards
Voir documentation spcialises pour plus d'infos
46
Cot servant
Squelette gre le dcodage des requtes d'appels de mthodes et
l'appel de la mthode requise ensuite
Avec les mcanismes d'introspection et d'appel dynamique de
Java, il n'est plus utile d'avoir un squelette ddi chaque interface
de mthodes
De manire gnrique, avec la signature d'une mthode (son nom, la
liste de ses paramtres et des types), on peut
Appel dynamique
Vrifier qu'un objet possde une mthode compatible
Appeler dynamiquement cette mthode
C'est ce qui est fait dans RMI depuis la version 1.2
Exemple d'appel de mthode dynamique
Appel d'une mthode addPersonne sur une classe DataManager
On peut noter que le nom de l'opration est stocke dans une
variable de type String
Nul part dans le code n'apparat l'appel explicite de la mthode
47
Introspection
Introspection : capacit s'interroger sur soi-mme
En Java : accder aux caractristiques d'un objet
Liste des attributs, mthodes, constructeurs, interfaces ...
En dynamique, pendant l'excution du programme
Classe [Link]
Mta-classe : classe dcrivant une classe
Une instance de Class dcrit le contenu d'une classe Java du
programme
Contient des mthodes pour
Lister ou rechercher les attributs, les mthodes
Instantier un objet de la classe reprsente par l'instance de la
classe Class
48
Introspection
Classe [Link]
Description d'une mthode
Nom de la mthode, types des attributs, type du paramtre de
retour ...
Mthode invoke permet d'invoquer dynamiquement la mthode
reprsente par une instance de Method sur un objet
Autres classes de l'API de rflexion de Java
Classe [Link]
Description d'un attribut d'une classe
Classe [Link]
Description d'un constructeur d'une classe
...
Voir API Java et tutoriaux pour plus d'informations
49
Invocation dynamique de mthode
Exemple : appel de addPersonne sur data manager
// instantiation d'un data manager quelque part dans le programme
DataManager dm = new DataManager();
...
// nom de la mthode appeler
String methodName = "addPersonne";
// paramtre de la mthode : une personne
Personne p = new Personne(40, "toto");
// tableau contenant les paramtres (la personne ici)
Object[] parameter = { p };
// tableau contenant les types des paramtres
Class[] parameterClass = { [Link]() };
// rcupre la description de la classe DataManager
Class cl = [Link]();
50
Invocation dynamique de mthode
Exemple : appel de addPersonne sur data manager (fin)
// rcupre la description de la mthode de DataManager dont
// la signature est : nom opration + types des paramtres
Method met = [Link](methodName, parameterClass);
// invocation dynamique de la mthode avec les paramtres
Object result = [Link](dm,parameter);
// affichage du resultat retourn
[Link](" retourne : "+result);
Note 1 : si mthode retourne un type primitif, le rsultat est
encapsul dans une instance de la classe reprsentant ce type
Exemple si retourne un int : invoke renvoie une instance de
[Link]
Fonctionnement similaire utiliser pour les paramtres
Note 2 : de nombreuses exceptions peuvent tre leves, voir l'API Java 51