87
Invocation de Méthode à des Objets distants Exemple : Java Remote Method Invocation Harmonisation AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc À travailler pour les TPs Concepts généraux Mise en œuvre Java

Invocation de Méthode à des Objets distants Exemple : Java R emote M ethod I nvocation

Embed Size (px)

DESCRIPTION

Invocation de Méthode à des Objets distants Exemple : Java R emote M ethod I nvocation. À travailler pour les TPs. Harmonisation AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc. Concepts généraux. Mise en œuvre Java. Points forts de la programmation par Objets. - PowerPoint PPT Presentation

Citation preview

Page 1: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

Invocation de Méthode à des Objets distants Exemple : Java

Remote Method Invocation

Harmonisation

AM Dery

Merci à Rémi Vankeisbelck, Michel Riveill etc

À travailler pour les TPs

Concepts généraux

Mise en œuvre Java

Page 2: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

2

Points forts de la programmation par Objets

• Application = collection d ’objets interagissant

• Séparation entre interface et implémentation

• Représentation et types de données

• Mécanismes d’abstraction

Page 3: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

3

Interface publique

crediterdebiter

Compte AM

montant

Objet utilisé

Compte AMcrediter 1000

Utilisation de l’objet

Interface = partie visible de l’objetImplémentation = partie privée inaccessible depuis d’autres objetsModifier l’implémentation des classes sans altérer l’utilisationInterface = contrat entre l’objet et le monde extérieur

Page 4: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

4

Classes et héritage

Com pte CodeviDepo ser

com pte PELDéb ite r

Com pte de particulierC re d ite rD e b ite r

Ajout de nouveaux types par création de classeAjout et surcharge des méthodes

Page 5: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

5

Maturation des communications Client Serveur

• Des programmes (fonctionnant sur des machines différentes) qui communiquent au travers du réseau.

• Un programme serveur offre des services (publie des fonctionnalités)

• Un programme Client utilise les fonctionnalités par envoi de requêtes à un programme serveur (qui prend en charge l’implémentation des fonctionnalités)

Page 6: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

6

Infrastructure Client Serveur

CLIENT SERVEUR

requêtes

Ensemble des requêtes = protocole d’application du service

Page 7: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

7

Client Serveur

Page 8: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

8

Appel de Procédure à Distance

CLIENT SERVEUR

F(1,  x)

marshalling

marshalling

unmarshalling

unmarshalling

0001101…

10001…

Implémentation def(int,String)

Marshalling : Préparer le format et le contenu de la trame réseauUnmarshalling : Reconstruire l’information échangée à partir de la trame réseau

Page 9: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

9

Et pour les objets distants

crediterdebiter

Compte AM

montant

Objet utiliséesur un serveur

Compte AMcrediter 1000

Objet utilisateurSur le client

crediter et débiter <-> services proposés par le serveurUn serveur peut abriter plusieurs objets distants et plusieurs types d’objets distant

Page 10: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

10

OD et héritage

Com pte CodeviDepo ser

com pte PELDéb ite r

Com pte de particulierC re d ite rD e b ite r

Spécialisation d’un serveur : changement de versions

Page 11: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

11

Infrastructure Objets Distribués

Objet Client

Objet Client Serveur Objet Serveur

Objet1

Objet2 Objet3

Page 12: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

12

Invocation de méthodes à distance

• Mécanisme qui permet à des objets localisés sur des machines distantes de s’échanger des messages (invoquer des méthodes)

Page 13: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

13

Invocation de méthodes distantes

• Semble simple en théorie...

• ... un peu plus complexe en réalité !!!

Page 14: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

14

RMI

• Heureusement, on utilise Java ;-)– Java Remote Method Invocation est la solution

à notre problème– RMI permet à des objets Java d ’invoquer des

méthodes sur des objets localisés dans des JVM différentes, et même distantes sur le réseau, et ceci de façon quasi transparente !!!

Page 15: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

15

Invocation de méthodes distantes

Page 16: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

16

Stubs et encodage des paramètres

• le code d’un objet client invoque une méthode sur un objet distant– Utilisation d’un objet substitut dans la JVM du

client : le stub (souche) de l ’objet serveur

Page 17: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

17

Stubs et encodage des paramètres

Page 18: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

18

Echange Client Serveur

• Le client appelle une méthode sur un OD

• Il appelle une méthode du stub • Le stub construit un bloc de

données avec – un identificateur de l’objet

distant à utilise– une description de la méthode

à appeler– les paramètres encodés qui

doivent être passés

• Le stub envoie ce bloc de données au serveur...

• Lorsque un objet de réception reçoit les données

• Le Squeleton effectue les actions suivantes :– décode les paramètres encodés– situe l ’objet à appeler– invoque la méthode spécifiée– capture et encode la valeur de

retour ou l ’exception renvoyée par l ’appel

– Puis le retourne au client– ………

Page 19: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

19

Encodage des paramètres

– Encodage dans un bloc d ’octets afin d ’avoir une représentation indépendante de la machine

– Types primitifs et «basiques» (int/Integer...)• Encodés en respectant des règles établies

• Big Endian pour les entiers...

– Objets ...

Page 20: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

20

Générateur de stubs

• Les stubs gèrent la communication ainsi que l'encodage des paramètres

• Processus complexe...

• Entièrement automatique– Un outil permet de générer les stubs pour les

OD

Page 21: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

21

Stubs et rmic

• La commande rmic du jdk rend transparent la gestion du réseau pour le programmeur– une référence sur un ODréférence son stub local

• syntaxe = un appel local– objetDistant.methode()

Page 22: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

22

• outil livré avec le JDK permet de générer les stubs

> rmic -v1.2 HelloWorldImpl

• génère un fichier HelloWorldImpl_stub.class

rmic doit être passé pour toutes les classes d'implémentation des OD afin d'en générer les stubs

L ’outil RMIC

Page 23: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

23

Un exemple : le sempiternel « Hello World » !!!

Page 24: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

24

Interfaces et classes prédéfinies

Page 25: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

25

• L ’interface HelloWorldimport java.rmi.*;interface HelloWorld extends Remote {public String sayHello()

throws RemoteException;}

Interface = protocole d ’application

Page 26: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

26

Rôle de l ’interface

HelloWorldHelloWorld

Page 27: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

27

• L ’exception RemoteException doit être déclarée par toutes les méthodes distantes– Appels de méthodes distants moins fiables que les

appels locaux• Serveur ou connexion peut être indisponible

• Panne de réseau

• ...

Les exceptions

Page 28: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

28

• Implémentation de la classe qui gère les méthodes de l ’interface HelloWorld// Classe d'implémentation du Serveur

public class HelloWorldImpl

extends UnicastRemoteObject

implements HelloWorld {

public String sayHello() throws RemoteException {

String result = « hello world !!! »;

System.out.println(« Méthode sayHello invoquée... » + result);

return result;

}

}

Du côté Serveur

Page 29: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

29

• doit implanter l ’interface HelloWorld• doit étendre la classe RemoteServer du

paquetage java.rmi• RemoteServer est une classe abstraite• UnicastRemoteObject est une classe concrète

qui gére la communication et les stubs

Classe d ’implémentation

Page 30: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

30

Classe d ’implémentation

HelloWorldHelloWorld

HelloWorldImpl

Page 31: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

31

HelloWorld hello = ...;// Nous verrons par la suite comment obtenir // une première référence sur un stub

String result = hello.sayHello();System.out.println(result);

Du côté client

Page 32: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

32

• On sait implanter un serveur d ’un côté, et appeler ses méthodes de l ’autre

MAIS

• Comment obtient-on une référence vers un stub d’un objet serveur ???

Référence sur un objet

Page 33: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

33

– On pourrait appeler une méthode sur un autre objet serveur qui renvoie une référence sur le stub...

– Mais comment localiser le premier objet ?

un Service de Nommage

Localisation des objets du serveur

Page 34: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

34

• Obtention d'une première référence sur un objet distant : « bootstrap » à l’aide d’un Service de Nommage ou Annuaire

• Enregistrement des références d'objets dans l'annuaire afin que des programmes distants puissent les récupérer

Les Services de Nommage

Page 35: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

35

• Implémentation d'un service de nommage

• Fourni en standard avec RMI

• Permet d'enregistrer des références sur des objets de serveur afin que des clients les récupèrent

• On associe la référence de l'objet à une clé unique (chaîne de caractères)

• Le client effectue une recherche par la clé, et le service de nommage lui renvoie la référence distante (le stub) de l'objet enregistré pour cette clé

Exemple : Le RMIRegistry

Page 36: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

36

– Programme exécutable fourni pour toutes les plates formes

– S'exécute sur un port (1099 par défaut) sur la machine serveur

– Pour des raisons de sûreté, seuls les objets résidant sur la même machine sont autorisés à lier/délier des références

– Un service de nommage est lui-même localisé à l'aide d'une URL

Le RMIRegistry

Page 37: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

37

• du package java.rmi– permet de manipuler le RMIRegistry

– supporte des méthodes statiques permettant de• Lier des références d'objets serveur

– Naming.bind(...) et Naming.rebind(...)

• Délier des références d'objets serveur– Naming.unbind(...)

• Lister le contenu du Naming – Naming.list(...)

• Obtenir une référence vers un objet distant– Naming.lookup(...)

La classe Naming

Page 38: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

38

• L ’objet serveur HelloWorld (coté serveur bien entendu…)– On a créé l'objet serveur et on a une variable qui le

référenceHelloWorld hello = new HelloWorldImpl();

– On va enregistrer l'objet dans le RMIRegistryNaming.rebind("HelloWorld",hello);

– L'objet est désormais accessible par les clients

Enregistrement d ’une référence

Page 39: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

39

• sur l'objet serveur HelloWorld– On déclare une variable de type HelloWorld et on effectue

une recherche dans l'annuaire

HelloWorld hello = (HelloWorld)Naming.lookup("HelloWorld");

– On indique quelle est l'adresse de la machine sur laquelle s'exécute le RMIRegistry ainsi que la clé

– La valeur retournée doit être transtypée (castée) vers son type réel

Obtention d'une référence coté client

Page 40: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

40

– Le Service de Nommage n'a pas pour fonction le référencement de tous les objets de serveur

• Il devient vite complexe de gérer l'unicité des clés

– La règle de bonne utilisation du Naming est de lier des objets qui font office de point d'entrée, et qui permettent de manipuler les autres objets serveurs

Remarques

Page 41: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

41

• Rappel– On veut invoquer la méthode sayHello() d'un objet de

serveur distant de type HelloWorld depuis un programme Java client

• Nous allons devoir coder– L'objet distant

– Le serveur

– Un client

– Et définir la liaison client serveur (les permissions de sécurité et autres emplacements de classes...)

Conception, implémentation et exécution de l'exemple

Page 42: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

42

• 1) Définir le protocole d’application - définir une interface Java pour un OD• 2) Implémenter le service - créer et compiler une classe implémentant cette

interface• 3) Offrir le service - créer et compiler une application serveur RMI• 4) Gérer la communication - créer les classes Stub (rmic)• 5) Lancer le serveur de nommage - démarrer rmiregistry et lancer

l’application serveur RMI

• 6) Définir un client qui appelle les services offerts par le serveur en se basant sur le protocole d’application

• créer, compiler et lancer le code accédant à des OD du serveur

Processus de développement

Page 43: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

43

– Une interface et une classe d'implémentation

– stubs générés automatiquement par rmic– toutes les classes nécessaires à l ’ objet de client doivent

être déployées sur la machine cliente et accessibles au chargeur de classes (dans le CLASSPATH)

– L'interface HelloWorld (HelloWorld.class)

– Le stub HelloWorldImpl_stub généré par rmic pour cet objet

Hello World : L'objet distant

Page 44: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

44

– instancie un objet de type HelloWorld et attache au service de nommage

– puis objet mis en attente des invocations jusqu'à ce que le serveur soit arrêté

import java.rmi.*;import java.rmi.server.*;

public class HelloWorldServer {

public static void main(String[] args) {try {

System.out.println("Création de l'objet serveur...");HelloWorld hello = new HelloWorldImpl();System.out.println("Référencement dans le RMIRegistry...");Naming.rebind("rmi://server/HelloWorld",hello);System.out.println("Attente d'invocations - CTRL-C pour

stopper");} catch(Exception e) {

e.printStackTrace();}

}}

Hello World : Le serveur

Page 45: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

45

– Apres avoir compilé le tout...

– Pour démarrer le serveur, il faut tout d'abord lancer le RMIRegistry• Attention : La base de registres RMI doit connaître les interfaces et les

stubs des objets qu'elle enregistre (CLASSPATH) !!!

> rmiregistry &

– et ensuite on lance le serveur

> java HelloWorldServer

Création de l'objet serveur...Référencement dans le RMIRegistry...Attente d'invocations - CTRL-C pour stopper

Serveur (suite)

Page 46: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

46

• obtenir une référence sur l'objet de serveur HelloWorld, invoquer la méthode sayHello(), puis afficher le résultat de l'invocation sur la sortie standardimport java.rmi.*;

public class HelloWorldClient {

public static void main(String[] args) {try {

System.out.println("Recherche de l'objet serveur...");HelloWorld hello = (HelloWorld)Naming.lookup("rmi://server/HelloWorld");System.out.println("Invocation de la méthode sayHello...");String result = hello.sayHello();System.out.println("Affichage du résultat :");System.out.println(result);System.exit(0);

} catch(Exception e) {e.printStackTrace();

}}

}

Hello World : client

Page 47: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

47

– Il suffit ensuite de lancer le programme

> java HelloWorldClient

Recherche de l'objet serveur...Invocation de la méthode sayHello...Affichage du résultat :hello world !!!

– Au niveau du serveur, le message... Méthode sayHello invoquée... hello world !!!

– ...s'affichera dans la console

Le client (suite)

Page 48: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

48

Passage de paramètres

• On sera souvent amenés à passer des paramètres aux méthodes distantes...

• Les méthodes distantes peuvent retourner une valeur ou lever une exception...

• On a deux types de paramètres– Les objets locaux au client– Les objets distants au client

Page 49: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

49

Passage de paramètres: ATTENTION

– Certains objets sont copiés (les objets locaux), d'autres non (les objets distants)

– Les objets distants, non copiés, résident sur le serveur– Les objets locaux passés en paramètre doivent être

sérialisables afin d'être copiés, et ils doivent être indépendants de la plate-forme

– Les objets qui ne sont pas sérialisables lèveront des exceptions

– Attention aux objets sérialisables qui utilisent des ressources locales !!!

Page 50: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

50

Que doit connaître le client ?

• Lorsqu’un objet serveur est passé à un programme, soit comme paramètre soit comme valeur de retour, ce programme doit être capable de travailler avec le stub associé

• Le programme client doit connaître la classe du stub

Page 51: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

51

Que doit connaître le client ?

• les classes des paramètres, des valeurs de retour et des exceptions doivent aussi être connues...– Une méthode distante est déclarée avec un type de

valeur de retour...– ...mais il se peut que l ’objet réellement renvoyé

soit une sous-classe du type déclaré

Page 52: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

52

Que doit connaître le client ?• Le client doit disposer des classes de stub, classes

des objets retournés…• copier les classes sur le système de fichiers local du client

(CLASSPATH)...

• ...cependant, si le serveur est mis à jour et que de nouvelles classes apparaissent, il devient vite pénible de mettre à jour le client

• C ’est pourquoi les clients RMI peuvent charger automatiquement des classes de stub depuis un autre emplacement

– Il s ’agit du même type de mécanisme pour les applets qui fonctionnent dans un navigateur

Page 53: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

53

• Séparation des classes– Serveur (fichiers nécessaires a l'exécution du serveur)

• HelloWorldServer.class

• HelloWorldImpl.class

• HelloWorld.class

• HelloWorldImpl_Stub.class

– Download (fichiers de classes à charger dans le programme client)• HelloWorldImpl_Stub.class

– Client (fichiers nécessaires au démarrage du client)• HelloWorld.class

• HelloWorldClient.class

Hello World : chargement dynamique

Page 54: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

54

Les points à approfondir

• Le fonctionnement des applications réparties– Chargement dynamique : mise en œuvre

– Passage de paramètres

– Notion d’annuaire

– Autres types de communications …

• Comment cela fonctionne au niveau du réseau.

Page 55: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

55

Comment cela fonctionne au niveau du réseau

• Rôle du stub – Identification de la machine qui abrite le

serveur par le client– Identification du serveur sur la machine– Canal de communication entre le serveur et le

client– Construction de la trame réseau– Echange du protocole d’application

Page 56: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

56

Passage de paramètres• On sera souvent amenés a passer des

paramètres aux méthodes distantes...

• Les méthodes distantes peuvent retourner une valeur ou lever une exception...

• On a deux types de paramètres– Les objets locaux– Les objets distants

Page 57: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

57

Passage de paramètres

• Lorsqu'un OD est passé d'un serveur à un client, le client reçoit en fait un stub

• A partir de ce stub, le client peut manipuler l'OD, mais celui-ci reste sur le serveur

• Fort heureusement, on peut également passer ou renvoyer n'importe quel objet en utilisant une méthode distante, et pas seulement ceux qui implémentent Remote...

Page 58: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

58

Passage de paramètresObjets locaux

• Exemple de passage local, le programme HelloWorld renvoie un objet String

• La chaîne est créée sur le serveur et doit être amenée chez le client comme valeur de retour

• String n'implémente pas Remote• Le client ne peut pas recevoir de stub

• Il doit se contenter d'une copie de la chaîne

Page 59: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

59

Passage de paramètresObjets locaux

• ...après l'appel, le client possède sa propre version de l'objet String, sur lequel il peut travailler

• La chaîne n'a plus besoin d'aucune connexion vers un objet du serveur

Page 60: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

60

Passage de paramètresObjets locaux

• Un objet non distant doit être transporté d'une JVM à une autre :

• L'objet est copié

• La copie de l'objet est envoyée au travers d'une connexion réseau

• => Très différent d'un passage de paramètres en local !!!

• Les références locales n'ont de sens que pour la JVM dans laquelle objets résident (adresses)

Page 61: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

61

Passage de paramètresObjets locaux

• RMI permet de transporter (copier) des objets complexes qui doivent avoir la capacité de se mettre en série

• RMI utilise les mécanismes de sérialisation inclus dans Java (java.io)

• Il faut des classes d'objets implémentant l'interface Serializable

Page 62: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

62

Passage de paramètresObjets locaux - exemple

• On crée un objet sérialisable local StateObject à deux états que l'on va passer à une méthode distante

• On crée un OD avec une méthode qui change l'état d'un objet StateObject qu'on lui passe en paramètre et qui le retourne

• Le client crée un objet StateObject et affiche son état

• Il invoque la méthode du serveur en lui passant l'objet à état créé et récupère le retour dans une variable

• Il affiche l'état de l'objet référencé avant invocation, puis de celui résultant de l'invocation

Page 63: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

63

Passage de paramètresObjets locaux - exemple

• Diagramme de classes

Page 64: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

64

Passage de paramètresObjets locaux - exemple

• La classe StateObject

Page 65: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

65

Passage de paramètresObjets locaux - exemple

• L'interface StateChanger

Page 66: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

66

Passage de paramètresObjets locaux - exemple

• La classe StateChangerImpl

Page 67: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

67

Passage de paramètresObjets locaux - exemple

• Le programme serveur

Page 68: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

68

Passage de paramètresObjets locaux - exemple

• Démarrage du serveur– On lance le rmiregistry– On lance le serveur

Page 69: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

69

Passage de paramètresObjets locaux - exemple

• Le programme client

Page 70: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

70

• Démarrage du client

• Conclusion– L'état de l'objet créé en local n'a pas changé, par contre,

l'objet retourné a un état différent– Il y a bien eu copie de l'objet

• Dans notre exemple, 2 copies !!!– Une lors du passage de so1 en paramètre

– L’autre lors du retour de la méthode

Passage de paramètresObjets locaux - exemple

Page 71: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

71

Passage de paramètresObjets locaux - exemple

Page 72: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

72

Passage de paramètresObjets distants

• Passage d'objets distants– Le passage d'un objet distant à une méthode ou comme

valeur de retour manipule en fait un stub– Exemple typique : la recherche d'objets dans la base de

registres rmiregistry

HelloWorld h = (HelloWorld)Naming.lookup(...);

• Retourne un stub pour un OD de type HelloWorld• L'appelant peut ensuite manipuler l'OD au travers du stub reçu

– Pas de copie de l'objet, mais transmission du stub

Page 73: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

73

Passage de paramètresObjets distants

• Passage d'objets distants– Très différent du passage d'objets locaux– Les objets locaux sont copiés

• Les deux protagonistes ne manipulent pas le même objet

– Passage d'OD = passage du stub• Pas de copie

• Les deux protagonistes manipulent le même objet au travers de son stub

Page 74: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

74

Passage de paramètresObjets distants

• On va créer un OD (1) de type HelloAccessor qui permet d'accéder à un autre OD (2) de type HelloWorld, situé dans la même JVM– Un client va

• 1) Obtenir une référence vers l'OD (1)

• 2) Invoquer sa méthode et récupérer l'OD (2)

• 3) Invoquer la méthode sayHello() de l'OD (2)

=> sayHello() affiche une trace dans la console... regardons si la trace s'affiche chez le client ou le serveur

Page 75: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

75

Passage de paramètresObjets distants - exemple

• Diagramme de classes

Page 76: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

76

Passage de paramètresObjets distants - exemple

• L'interface HelloAccessor

Page 77: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

77

Passage de paramètresObjets distants - exemple

• La classe HelloAccessorImpl

Page 78: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

78

Passage de paramètresObjets distants - exemple

• Le serveur HelloAccessorServer

Page 79: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

79

Passage de paramètresObjets distants - exemple

• Démarrons le serveur– 1) Démarrage du rmiregistry– 2) Démarrage du serveur

– => Le serveur est lancé, occupons nous maintenant du client...

Page 80: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

80

Passage de paramètresObjets distants - exemple

• Le client HelloAccessorClient

Page 81: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

81

Passage de paramètresObjets distants - exemple

• Démarrage du client

• => Pas de trace niveau client...

• Regardons la trace serveur :

=> La méthode a bien été exécutée sur le serveur !

Page 82: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

82

Objets distants - exemple

Page 83: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

83

Passage de paramètresParamètres inappropriés

• Un exemple : passer des objets de type Graphics (java.awt) à une méthode distante

– Graphics n'implémente pas les interfaces distantes

– Une copie de l'objet Graphics doit donc être passée

– ...On ne peut pas faire cela !!!

– En réalité, Graphics est une classe abstraite

– Les objets Graphics sont renvoyés par un appel à Component.getGraphics()

– Cet appel ne peut se produire que si l'on possède une sous-classe qui implémente un contexte graphique sur une plate-forme spécifiée

– Ces objets interagissent avec le code natif et l'adressage local

Page 84: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

84

Passage de paramètresParamètres inappropriés

• Tout d'abord, la plate-forme peut être différente– Client sous Windows, serveur sous X11

– Le serveur ne dispose pas des méthodes natives nécessaires pour afficher des graphiques sous Windows

• Même si la plate-forme est la même– Client et serveur sous X11

– Les valeurs des pointeurs ne correspondent a rien

=> Cela n'a pas de sens de copier un objet de type Graphics, ils ne sont donc pas sérialisables et ne peuvent être envoyés par RMI

Page 85: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

85

Passage de paramètresConclusion

• Il faut être vigilant quand au passage des paramètres dans les applications RMI...– Certains objets sont copiés (les objets locaux), d'autres non

(les objets distants)– Les objets distants, non copiés, résident sur le serveur– Les objets locaux passés en paramètre doivent être

sérialisables afin d'être copiés, et ils doivent être indépendants de la plate-forme

– Les objets qui ne sont pas sérialisables lèveront des exceptions– Attention aux objets sérialisables qui utilisent des ressources locales !!!

Page 86: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

86

Conclusion

– RMI permet aux objets Java et à leurs méthodes de devenir distants relativement facilement

– Le JDK inclut les interfaces et classes spéciales pour RMI par défaut

– On peut passer presque tous les types de paramètres

– Les objets de serveur peuvent être accédés en environnement concurrent

Nous avons une bonne réponse a notre question initiale => Voilà une bonne façon de distribuer des objets !!!

Page 87: Invocation de Méthode à des Objets distants  Exemple : Java R emote  M ethod  I nvocation

87

Quelques bouquins...

• Core Java Volume 2• Par Cay S. Horstmann & Gary Cornell

• Editions CampusPress

• Une référence pour les développeurs Java

• Bonne section sur RMI, servi de base pour ce cours

• Java Distributed Computing• Par Jim Farley

• Editions O'Reilly

• Tout sur les applications reparties avec Java

• Plus technique...