You are on page 1of 26

Middleware RMI

Cours assuré par Mme Allal

1
Application Répartie
• Une application répartie est une application dont les classes sont
réparties sur plusieurs machines différentes. Dans de telles
applications, on peut invoquer des méthodes à distance. Il est alors
possible d’appeler la méthode d’un objet qui n’est pas situé sur la
machine locale.
• Comment trouver une solution ?
• Programmation OO = envoi de requêtes entre plusieurs objets
• Ne peut-on pas placer des objets sur différents ordinateurs de sorte qu’ils
puissent s ’envoyer directement des messages

2
Middleware
• Appel de méthode à distance
• Extension « naturelle » de l'appel local d'opérations dans le contexte des
systèmes distribués
• Une partie serveur offre une opération appelée par une partie client permet
d'appeler une méthode sur un objet distant (presque) aussi facilement que
localement
• Exemple:
• RPC (Remote Procedure Call)
• CORBA (Common Object Request Broker Architecture)
• Java RMI (Remote Method Invocation)
3
Caractéristiques générales
• Caractéristiques que peut assurer un middleware
• Transparence à la localisation/accès : Accès à des objets/ressources distantes
aussi facilement que localement et indépendamment de leur localisation

• Services offerts par un middleware


• Un ou plusieurs services de communication/interaction
• Service de nommage

4
Middleware
• Service de nommage du middleware
• Pour enregistrer, identifier et rechercher les éléments et services connectés via
le middleware
• Service de nommage, cas du middleware RMI
• Service d'un élément = opération(s) offerte(s) par un objet et pouvant être
appelée(s) par d'autres
• Un élément enregistre les opérations qu'il offre
• Recherche d'un élément
• On sait identifier l'élément distant et on demande à récupérer la référence sur cet élément
• Une fois la référence sur l'élément distant connu, on peut appeler l'opération
sur cet élément via cette référence

5
Middleware

6
Middleware
• Description des différents éléments :
• Éléments dont le code est généré automatiquement via des outils du
middleware
• Talon (stub) : élément du coté client qui offre localement les mêmes
opérations (la même interface) que le servant (serveur)
• Squelette (skeleton) : élément du coté serveur qui reçoit les requêtes
d'appels d'opérations des clients et les lance sur le servant

7
Middleware
• Partie client : partie qui appelle l'opération distante
• Partie serveur : partie qui offre l'opération distante via une interface
• appelée aussi « servant » pour certains middleware
• A implémenter par le développeur : contient le code des opérations de
l'interface
• Des 2 cotés : éléments de communication entre parties client/serveur
• Internes au middleware
• Utilisent les couches TCP ou UDP via des sockets pour gérer la
communication entre les talons et squelettes

8
Middleware
• Fonctionnement général d'un appel d'opération à distance
• 1. La partie client récupère via le service de nommage une référence d'objet sur le
servant distant. En réalité, une référence sur le talon local
• 2. La partie client appelle une opération sur cette référence d'objet
• Appel synchrone : la partie client attend que l'appel de l'opération soit terminé
pour continuer son exécution
• 3. Le talon, qui reçoit cet appel, « compacte » toutes les données relatives à
l'appel (identificateur opération (méthode) + paramètres)
• 4. L'élément de communication envoie les données à l'élément de communication
coté serveur
• 5. L'élément de communication coté serveur envoie les données au squelette
9
Middleware
• 6. Le squelette décompacte les données pour déterminer l'opération
à appeler sur le servant
• 7. L'opération est appelée sur le servant par le squelette, le squelette
récupère la valeur de retour de l'opération, la compacte et l'envoie au
talon via les éléments de communication
• 9. Le talon décompacte la valeur et la retourne à la partie client
• 10.L'appel de l'opération distante est terminé, la partie client
continue son exécution

10
JAVA RMI

11
Java RMI

• Spécifique au langage Java : ne fait communiquer que des éléments


écrits en Java
• Suit l'architecture et les règles de fonctionnement des middlewares
étudiées dans les slides précédents

12
RMI : Remote method invocation
Avoir un système réparti «idéal » serait d’avoir un système distribué
utilisant la technologie objet et permettant :
1) d’invoquer une méthode d’un objet se trouvant sur une autre
machine exactement de la même manière que s’il se trouvait au
sein de la même machine : objetDistant.methode() ;
2) d’utiliser un objet distant (OD), sans savoir où il se trouve, en
demandant à un service « dédié » de renvoyer son adresse :
objetDistant = ServiceDeNoms.recherche("monObjet");

13
Java RMI
• Package java.rmi et sous-packages
• Packages contenant les classes à utiliser ou spécialiser pour des communications
via RMI
• Règles principales à suivre
• Une interface d'opérations appelables à distance doit spécialiser l'interface
java.rmi.Remote
• Une opération de cette interface doit préciser dans sa signature qu'elle peut lever
l'exception RemoteException
• Le servant implémente une interface spécialisant Remote et doit spécialiser (ou
utiliser des services de) Uni­castRemoteObject
• Les classes des données en paramètres ou retour des opérations doivent
implémenter Serializable
15
RMI : Remote method invocation
Principes
1) Un objet distant (objet serveur) : ses méthodes sont invoquées depuis une autre
JVM
-dans un processus différent (même machine)
-ou dans une machine distante (via réseau)
2) Un OD (sur un serveur) est décrit par une interface distante Java
-déclare les méthodes distantes utilisables par le client
3) Une invocation distante (RMI) est l ’action d’invoquer une méthode d’une interface
distante d’un objet distant.
4) Une invocation de méthode sur un objet distant a la même syntaxe qu’une
invocation sur un objet local.
5) Un OD se manipule comme un objet local
16
Java RMI
• Contraintes sur interface d'opérations
• Spécialise (étend) java.rmi.Remote : précise qu'il s'agit d'une interface de service
appelables à distance
• Chaque opération doit préciser dans sa signature qu'elle peut lever l'exception
RemoteException
• L'opération peut également lever des exceptions spécifiques à l'application
• RemoteException est la classe mère d'une hiérarchie d'une vingtaine d'exceptions
précisant un problème lors de l'appel de l'opération, comme, par exemple
NoSuchObjectException : ne peut récupérer la référence sur l'objet distant
UnknowHostException : la machine distante n'a pas été trouvée
AlreadyBoundException : le nom associé à l'objet est déjà utilisé
ConnectException : connexion refusée par la partie serveur

17
Java RMI
• Exemple d'interface, définissant 2 méthodes :
• public interface IRectangle extends Remote {
• public int calculSurface(Rectangle rect) throws RemoteException;
• public Rectangle decalerRectangle(Rectangle rect, int x, int y) throws
RemoteException;
}
• Lors de l'implémentation des méthodes de l'interface, on ne traite pas
directement les cas d'erreurs correspondant à la levée d'une exception
RemoteException
• C'est le middleware qui le fera coté client en cas de besoin
18
Java RMI
• La classe Rectangle permet de décrire les coordonnées 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;
}}
19
Java RMI
• La classe implémentant l'interface doit utiliser (étendre) la classe
UnicastRemoteObject (talon serveur)
public class RectangleImpl extends UnicastRemoteObject 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);
}}

20
Java RMI
• Une partie client doit pouvoir récupérer une référence sur l'objet
distant implémentant l'interface
• Utilise les services du registre, annuaire ...
• Un client accède au registre via la classe Naming

21
Java RMI
• 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 registre)
• port : port sur lequel écoute le registre
• nomObj : nom donné à un objet offrant des opérations
• Si pas précision du port : port par défaut utilisé par le registre
• Si pas précision de l'hôte : registre local par défaut (localhost)

22
Java RMI
• Lancement du registre : Par défaut, port 1099
• Classe java.rmi.Naming
Quelques opérations statiques pour enregistrer des objets et récupérer leurs références
• void bind(String name, Remote obj)
Enregistre un objet sous le nom name (erreur si déjà un objet avec ce nom)
• void rebind(String name, Remote obj)
Enregistre un objet sous le nom name, en écrasant la précédente liaison objet/nom si elle
existait
• void unbind(String name)
Supprime du registre la référence vers l'objet nommé name
• Remote lookup(String name)
Retourne une référence sur l'objet dont le nom est passé en paramètre

23
RMI : Remote method invocation

24
RMI : Remote method invocation
Processus de développement d’une application RMI
1) définir une interface Java pour un OD
2) créer et compiler une classe implémentant
cette interface
3) créer et compiler une application serveur RMI
4) démarrer l’annuaire et lancer l’application serveur RMI
5) créer, compiler et lancer un programme client
accédant à des OD du serveur

25
RMI : Remote method invocation :coté serveur
1. public interface nom extends Remote {
// Déclarer toutes les méthodes à utiliser, elles doivent lever l’exception (throws RemoteExeception);
}
2. Définir des classes si nécessaire.
3. Public class nom extends UnicastRemoteObject implements nom_interface
{ //Définir toutes les méthodes déclarées dans l’interface
public static void main(String[] args) {
Try{
• LocateRegistry.createRegistry(1099); //creation de l’annuaire qui utilise par défaut le port 1099
• Nom_classe objet=new nom_classe(); //instancier un objet
• System.out.println(objet.toString());// afficher les informations sur l’objet
• Naming.rebind("rmi://localhost:1099/OB", objet); //mettre l’objet dans l’annuaire
• } catch (Exception e) {
• e.printStackTrace();
•}
•}
}

26
RMI : Remote method invocation :coté client
• Définir l’interface
1. public interface nom extends Remote {
// Déclarer toutes les méthodes à utiliser, elles doivent lever l’exception (throws
RemoteExeception);
}
• public static void main(String[] args) {
• try {NomInterface stub=(NomInterface) Naming.lookup("rmi://localhost:1099/OB");
• //Appel aux méthodes a l’aide de l’objet stub
• } catch (Exception e) {
• e.printStackTrace();
• }

27

You might also like