Вы находитесь на странице: 1из 51

UE NSY107

Java RMI
CNAM Aquitaine
Eric Cariou
Universit de Pau et des Pays de l'Adour
UFR Sciences Pau Dpartement Informatique
Eric.Cariou@univ-pau.fr
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 java.rmi 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 java.rmi.Remote

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 java.rmi.Remote : 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 :

UnicastRemoteObject.exportObject(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 {
UnicastRemoteObject.exportObject(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 java.rmi.registry.LocateRegistry

public static Registry createRegistry(int port)


throws RemoteException

Lance un registry localement sur le port d'coute pass en


paramtre
10

Registry

Classe java.rmi.Naming

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

Naming.rebind("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)
Naming.lookup("rmi://scinfr222/opRect");
// une fois la rfrence obtenue, on appelle normalement les oprations
// de l'interface sur cet objet (en catchant RemoteException)
int surface = opRectangle.calculSurface(r1);
r2 = opRectangle.decalerRectangle(r1, 15, 10);
System.out.println(" surface de r1 = "+surface);
System.out.println(" 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 {
System.out.println(" nouvelle valeur : "+value);
}
// mthode appeller pour s'enregistrer auprs de l'observ
public void subscribeToObservee() {
try {
ISubscription sub = (Isubscription)
Naming.lookup("rmi://scinfe222/observee");
sub.subscribe(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 {
observerList.add(obs);
}
// dsenregistrement d'un observateur distant
public synchronized void unsubscribe(IChangeValue obs)
throws RemoteException {
observerList.remove(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<observerList.size(); i++)
try {
obs = (IChangeValue)observerList.elementAt(i);
obs.newValue(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();
Naming.rebind("observee", obs);
for (int i=1; i<=5; i++) {
obs.changeValue(i*10);
Thread.sleep(1000);
}

Lancement d'un observateur


Observer obs = new Observer();
obs.subscribeToObservee();
// 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

java.rmi.server.codebase, positionner en lanant


le programme Java

URL est de type file, ftp ou http

Exemples

$ java -Djava.rmi.server.codebase=file:///home/
ecariou/test-rmi/ Serveur
$ java -Djava.rmi.server.codebase=http://www.univpau.fr/~ecariou/test-rmi/ 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 java.lang.SecurityManager

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 :


java.rmi.RMISecurityManager

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 toutesPermissions.policy

grant {
permission java.security.AllPermission;
};
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
System.setSecurityManager(new RMISecurityManager()));

Pour utiliser un fichier policy, positionner la proprit


java.policy au lancement du programme
$ java -Djava.security.policy=toutesPermissions.policy
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 (Client.java) va tlcharger les classes


dynamiquement

Elle doit donc positionner un security manager pour commencer


// positionne le security manager acceptant tout

System.setSecurityManager(new SecurityManagerOuvert());
Rectangle r1, r2;
r1 = new Rectangle(10, 10, 20, 30);
IRectangle opRectangle = (IRectangle)
Naming.lookup("rmi://scinfe222/opRect");
r2 = opRectangle.decalerRectangle(r1, 15, 10);
System.out.println("classe de IRectangle = "
+opRectangle.getClass());
System.out.println("classe de r2 = "+r2.getClass());

36

Mobilit de code

Exemple (suite)

Le serveur (Serveur.java) est lanc en prcisant un


codebase pour accder aux classes requises

Il instantie un RectangleImpl et l'enregistre auprs du registry

$ java -Djava.rmi.server.codebase=http://www.univpau.fr/~ecariou/test-rmi/ 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
http://www.univ-pau.fr/~ecariou/test-rmi/

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 java.lang.Object

Pour la gestion des rfrences distantes

Interface java.rmi.server.Unreferenced 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 java.rmi.dgc.leaseValue

Le bail est de 10 minutes par dfaut

Pour le modifier, on peut le faire au lancement du


programme

$ java -Djava.rmi.dgc.leaseValue=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 java.lang.Class

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 java.lang.reflect.Method

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 java.lang.reflect.Field

Description d'un attribut d'une classe

Classe java.lang.reflect.Constructor

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 = { p.getClass() };
// rcupre la description de la classe DataManager
Class cl = dm.getClass();

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 = cl.getMethod(methodName, parameterClass);

// invocation dynamique de la mthode avec les paramtres


Object result = met.invoke(dm,parameter);
// affichage du resultat retourn
System.out.println(" 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


java.lang.Integer

Fonctionnement similaire utiliser pour les paramtres

Note 2 : de nombreuses exceptions peuvent tre leves, voir l'API Java 51

Вам также может понравиться