Vous êtes sur la page 1sur 60

Middleware Java RMI

Eric Cariou Universit de Pau et des Pays de l'Adour Dpartement Informatique Eric.Cariou@univ-pau.fr
1

Middleware (intergiciel en franais) : couche logiciel


S'intercale entre le systme d'exploitation/rseau et les lments de l'application distribue Offre un ou plusieurs services de communication entre les lments formant l'application ou le systme distribu

Middleware

Services de plus haut niveau que les communications via sockets TCP/UDP, augmentation du niveau d'abstraction Client 1 Middleware Client 2 Middleware Couches rseau Systme Exploit. Matriel Rseau physique Serveur Middleware

Couches rseau Systme Exploit. Matriel

...

Couches rseau Systme Exploit. Matriel 2

Middleware Plusieurs grandes familles de middleware

Appel de procdure/mthode distance

Extension naturelle de l'appel local d'opration dans le contexte des systmes distribus Une partie serveur offre une opration appele par une partie client Permet d'appeler une procdure/mthode sur un lment/objet distant (presque) aussi facilement que localement Exemples (dans ordre historique d'apparition) RPC (Remote Procedure Call) : solution de Sun pour C/Unix CORBA (Common Object Request Broker Architecture) : standard de l'OMG permettant l'interoprabilit quelque soit le langage ou le systme Java RMI (Remote Method Invocation) : solution native de Java Famille des MOM (Message Oriented Middleware) Event Service de CORBA, JMS de Java Accs une mmoire commune distribue JavaSpace de Java

Envoi ou diffusion de messages ou vnements


Mmoire partage

Familles de middlewares, caractristiques gnrales

Middleware

Modle RPC/RMI

Interaction forte entre parties client et serveur Appel synchrone (pour le client) d'opration sur le serveur Gnralement, le client doit explicitement connatre le serveur Peu dynamique (point de vue serveur) car les lments serveurs doivent tre connus par les clients et lancs avant eux Mode 1 vers 1 : opration appele sur un seul serveur la fois Asynchrone et pas d'interaction forte entre lments Envoi de message est asynchrone Pas de ncessit de connatre les lments accdant la mmoire Permet une plus forte dynamicit : ajout et disparation d'lments connects au middleware facilits par les faibles interactions et l'anonymat Mode 1 vers n Diffusion de messages plusieurs lments en mme temps Accs aux informations de la mmoire par plusieurs lments

Modles message ou mmoire partage

Middleware middleware Caractristiques que peut assurer un

Transparence la localisation

Accs des objets/ressources distantes aussi facilement que localement et indpendamment de leur localisation

Cas pour tous les middleware

Support de l'htrognit des systmes et des langages

CORBA par exemple : fait interoprer via du RPC/RMI des lments logiciels crits dans n'importe quel langage

Tout autre type de transparence (voir cours intro), selon le middleware Un ou plusieurs services de communication/interaction

Services offerts par un middleware


RPC, diffusion de message, mmoire partage ... 5

Service de nommage

Service de nommage du middleware

Middleware

Pour enregistrer, identifier et rechercher les lments et services connects via le middleware Service d'un lment = (interfaces d') opration(s) offerte(s) par un lment et pouvant tre appele(s) par d'autres Un lment enregistre les oprations qu'il offre Recherche d'une opration ou d'un lment, 2 modes

Service de nommage, cas des middlewares RPC/RMI


On demande recevoir une rfrence sur un lment qui offre une opration compatible avec celle que l'on cherche On sait identifier l'lment distant et on demande rcuprer la rfrence sur cet lment

Une fois la rfrence sur l'lment distant connu, on peut appeler l'opration sur cet lment via cette rfrence
6

Middleware RPC/RMI

Architecture gnrale, plusieurs couches


Partie Client Talon Elt Communication Couche Rseau Machine A
Communication via le rseau Communication logique

Classes du dveloppeur Accs au middleware Interne au middleware Systme d' exploitation

Partie Serveur/ Servant Squelette Elt Communication Couche Rseau Machine B 7

lments de l'architecture gnrale


2 catgories

Middleware RPC/RMI

lments communiquants raliss par le dveloppeur lments permettant la communication

Description des diffrents lments


lments dont le code est gnr automatiquement via des outils du middleware

Talon (stub) : lment/proxy du cot client qui offre localement les mmes oprations (la mme interface) que le servant Squelette (skeleton) : lment du cot serveur qui reoit les requtes d'appels d'oprations des clients et les lance sur le servant 8

Description des diffrents lments (suite)


Middleware RPC/RMI

Partie client : partie qui appelle l'opration distante Partie serveur : partie qui offre l'opration distante via une interface

Appele aussi servant pour certains middleware A implmenter par le dveloppeur : contient le code des oprations de l'interface

Des 2 cots : lments de communication entre parties client/serveur


Internes au middleware Attaquent les couches TCP ou UDP via des sockets pour grer la communication entre les talons et squelettes

Fonctionnement gnral d'un appel d'opration distance


1. La partie client rcupre via le service de nommage une rfrence d'objet sur le servant distant

Middleware RPC/RMI

En ralit, une rfrence sur le talon local Appel synchrone : la partie client attend que l'appel de l'opration soit termin pour continuer son excution

2. La partie client appelle une opration sur cette rfrence d'objet

3. Le talon, qui reoit cet appel, compacte (marshall) toutes les donnes relatives l'appel (identificateur opration + paramtres) 4. L'lment de communication envoie les donnes l'lment de communication cot serveur 5. L'lment de communication cot serveur envoie les donnes au squelette 6. Le squelette dcompacte les donnes (unmarshall) pour dterminer l'opration appeler sur le servant 7. L'opration est appele sur le servant par le squelette 10

Middleware RPC/RMI

Fonctionnement gnral d'un appel d'opration distance (fin)


Mme si pas de valeur de retour, on renvoie quelque chose au talon pour l'informer de la fin de l'appel d'opration

8. Le squelette rcupre la valeur de retour de l'opration, la compacte et l'envoie au talon via les lments de communication

9. Le talon dcompacte la valeur et la retourne la valeur la partie client 10.L'appel de l'opration distante est termin, la partie client continue son excution

11

Gestion des problmes de communication entre partie client et servant


Problmes potentiels

Middleware RPC/RMI

Le servant est plant ou inaccessible La requte d'appel d'opration n'a pas t reue cot servant La rponse la requte n'a pas t reue par la partie client L'excution de l'opration s'est mal passe ...

En cas de problmes, cot client, on n'a pas reu la rponse la requte


Doit renvoyer la requte au serveur a priori Mais cot serveur, si l'opration modifie un tat doit viter de rappeller l'opration a priori Plusieurs cas possibles pour grer cela

12

Middleware RPC/RMI

4 smantiques possibles pour l'appel d'oprations


Peut-tre

On ne sait pas si l'opration a t appele L'opration a t appele au moins une fois mais peut-tre plusieurs fois galement

Au moins une fois

Problme si opration modifie un tat (opration non idempotente)

Au plus une fois

L'opration est appele une seule fois ou on reoit un message informant qu'un problme a eu lieu et que l'opration n'a pas t appele Cas idal mais difficile atteindre 13

Une fois

Middleware RPC/RMI

Trois caractristiques pour grer les requtes d'appels d'oprations


Retransmission de la requte

Le client peut redemander au serveur d'appeler l'opration en cas de non rponse reue de sa part Si le serveur dtecte qu'il s'agit d'une redemande d'appel d'opration, il n'excute pas une nouvelle fois l'opration Le serveur garde un historique des valeurs de retour des oprations et peut renvoyer le rsultat retourn pour une opration en cas de nouvelle demande de cette mme opration

Filtrage des duplicats de requtes

Retransmission des rsultats

14

Middleware RPC/RMI

Trois combinaisons principales de caractristiques et smantiques associes


Pas de retransmission de la requte

Smantique peut-tre

Retransmission des requtes mais pas de filtrage des duplicats de requtes

Smantique au moins une fois

Retransmission des requtes, filtrage des duplicats de requtes et utilisation de l'historique des rponses

Smantique au plus une fois

15

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

Garbage collector distribu

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)
16

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 prenant en compte la fois les rfrences locales et distantes
17

En distribu peut utiliser un fonctionnement similaire

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 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 18

Si une machine distante est plante ou est inaccessible


Java RMI

19

Java intgre en natif deux middlewares de type RPC/RMI


Java RMI

Java RMI Une mise en oeuvre de CORBA 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

Java RMI

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 le faisait dans le TP2 avec dcodage des messages)

20

Package java.rmi et sous-packages


Packages contenant les classes utiliser ou spcialiser pour des communications via RMI 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 21 oprations doivent implmenter Serializable

Java RMI

Rgles principales suivre

Contraintes sur interface d'oprations


Interface

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

L'opration peut galement lever des exceptions spcifiques l'application

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

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

22

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; }

Exemple d'interface

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 23

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+")"; } }

Exemple d'interface

Note : les attributs sont publics par souci de simplification

24

La classe implmentant l'interface doit utiliser la classe UnicastRemoteObject


Cette classe sert la communication via TCP

Servant : exportation

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
25

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

26

Une partie client doit pouvoir rcuprer une rfrence sur l'objet distant implmentant l'interface

Registry

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)
27

Lancement du registry

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

28

Classe java.rmi.Naming

Registry

5 oprations statiques pour enregistrer des objets et rcuprer leurs rfrences (lvent toutes plusieurs exceptions voir API)

void bind(String name, Remote obj)

Enregistre un objet sous le nom name (erreur si dj un objet avec ce nom) Enregistre un objet sous le nom name, en crasant la prcdente liaison objet/nom si elle existait Supprime du registry la rfrence vers l'objet nomm name Retourne l'ensemble des noms des objets enregistrs sur le registry Retourne une rfrence sur l'objet dont le nom est pass en paramtre Exception NotBoundException leve si objet pas trouv par le registry

void rebind(String name, Remote obj)

void unbind(String name)

String[] list(String name)

Remote lookup(String name)


Attribut name dans les 5 oprations : sous la forme URL de type RMI

29

Pour pouvoir appeler les oprations distance, il faut gnrer le stub (talon)
Et le squelette avant la version 1.2 de Java 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)

Gnration stub/squelette

Utilitaire : rmic

Pas de manipulation directe dans notre code de ce fichier 30

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
31

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);

32

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 33

Passage des paramtres/donnes


Lors d'appel de mthodes distantes : 4 cas pour grer les paramtres ou la valeur retourne selon la classe du paramtre
Si classe implmente Remote : passage par adresse

On passe ou rcupre la rfrence sur un objet distant L'objet est clon, on passe ou rcupre une copie de l'objet

Si classe n'implmente pas Remote : passage par valeur

Pour types primitifs : passage par valeur galement


Si classe n'implmente pas Serializable : objet ne peut pas tre paramtre ou la classe ne peut pas tre un type de retour

Les paramtres ou valeurs de retour sont forcment srialiss pour tre transmis via le rseau 34

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 Diffrence entre appelant et appel de l'opration Chaque lment peut jouer les 2 rles indiffremment
35

Note sur les termes partie serveur et partie client

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 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; } 36

Appels en retour

Interface d'oprations, cot observateur

Appels en retour

Interface d'opration 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 37

Implmentation de l'observateur

Appels en retour

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(); } }

38

Implmentation de l'observ
// liste des observateurs protected Vector observerList; // donne observe protected int value = 0;

Appels en retour

public class Observee extends UnicastRemoteObject implements Isubscription {

// 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); }

39

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(); } }

40

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 41

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 42

Appels concurrents d'oprations


Les mthodes de l'observateur sont marques avec synchronized
Pour viter des incohrences en cas d'appels concurrents En interne de 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

Cot servant

43

Rfrence sur un objet distant

Mobilit de code

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

44

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 45

Gestion de la scurit

Mobilit de code

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 ... 46

Gestion de la scurit (suite)

Mobilit de code

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 les permissions : java.policy 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) { } }

Exemple, en donnant toutes les permissions


47

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 Assez complexe apprhender et comprendre... Voir les documentations spcialises ce sujet
48

Comment positionner des permissions plus prcises ?


Fonctionnement gnral pour rcuprer le stub cot client

Mobilit de code

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) 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

Quand un client demande rcuprer la rfrence sur un objet

49

Rcupration des stubs, principaux cas (modulables entre eux)


Les parties serveurs et clients ont accs aux bonnes classes via leur CLASSPATH

Mobilit de code

Pas besoin de prciser de codebase, tout sera charg localement Dynamique cot client

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

50

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 concret : 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); } }

51

Exemple (suite)

Mobilit de code

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); } (...)

52

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
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());

System.setSecurityManager(new SecurityManagerOuvert());

53

Exemple (suite)

Mobilit de code

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 54

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/
Si l'excution des exceptions UnmarshalException, AccessDeniedException ou ClassNotFoundException sont leves

Note

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 55

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

Mobilit de code

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 56

Java RMI gre un garbage collector distribu


En local, pour effectuer des actions avant la destruction d'un objet

Garbage collector

Redfinition de la mthode finalize() de java.lang.Object 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

Pour la gestion des rfrences distantes


Ce que l'on peut faire par exemple dans cette mthode : dsexporter l'objet : unexporteObject(this, true);

57

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
58

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 Permet de n'activer l'objet que quand il est sollicit

Exportation de l'objet

Variante possible : Activable


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
59

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

60