Des sockets à RMI. Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Introduction aux environnements répartis
Invocation de Méthode à des Objets distants RMI et Corba
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Objets Distribués et Composants
Plan de l’enseignement
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
Harmonisation AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
Retour sur RMI.
1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
Java et la réflexivité.
Communication par diffusion : Multicast
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
Des sockets à RMI Programmation réseau versus programmation objet
Objets Distribués Chronique dune invasion annoncée Pourquoi? Comment? Qui : Corba / COM-DCOM / Java RMI...
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
Objets Distribués Chronique d ’une invasion annoncée
Des sockets à RMI. Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur.
Des sockets à RMI.
À travailler seuls Département SI AM Dery Concepts généraux
À travailler seuls Département SI AM Dery Concepts généraux
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Introduction aux applications réparties
Exposé de Système - Informatique et Réseau
Introduction à Java - les paquetages -
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
51 Les technologies XML Cours 6 : XML et les architectures N-tiers – Tier Métier Janvier Version 1.0 -
Cours 6 : XML et les architectures N-tiers – Tier Applicatif
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance

Etude des Technologies du Web services
SECURITE DU SYSTEME D’INFORMATION (SSI)
Programmation orientée objet
XML-Family Web Services Description Language W.S.D.L.
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Olivier DERUELLE Erwan FOUYER Maxime JOUIN Rodolphe LOUE
Java Remote Method Invocation (RMI)
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
.Net Remoting.
Interopérabilité JOnAS - CORBA
À travailler seuls Concepts généraux Mise en œuvre Java Année
Objets Distribués Chronique d’une invasion annoncée Pourquoi? Comment?
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
J2EE vs .NET Réaliser par : SEIF ENNACER BADRA && CHETOUI RIM.
Présentation de CORBA et de IIOP
1 Architecture orientée service SOA Architecture orientée service SOA (Service Oriented Architecture)
11/04/ L'héritage Cours 7 Cours 7.
Créer des packages.
Systèmes distribués Plusieurs technologies existent : Les sockets
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Le web service
Mastère Professionnel Systèmes de Communication et Réseaux
Tutorat en bio-informatique
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
Les sockets.
Module 3 : Création d'un domaine Windows 2000
Les RPC remote procedure call
 Formulaires HTML : traiter les entrées utilisateur
Cours MIAGE « Architectures Orientées Services »Henry Boccon-GibodCours MIAGE « Architectures Orientées Services »Henry Boccon-Gibod 1 Architectures Orientées.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
PaCO++ André Ribes Réunion Hydrogrid Rennes 15/09/03.
Architecture Client/Serveur
Java Remote Method Invocation
Parquet Geoffrey 3 ARIL EXIA.CESI ARRAS. Présentation du MLD Présentation de la persistance Présentation récapitulatif du projet JSP/SERVLET MVC Cycle.
Applications distribuées Introduction Jean-Jacques LE COZ.
Transcription de la présentation:

Des sockets à RMI

Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur –sockets –RPC –couches OSI

Lhéritage de la programmation Client Serveur Appel de procédures à distance Importance du marshalling Des serveurs accessibles simultanément par plusieurs clients Enregistrement des serveurs dans des annuaires de noms Communication connectée ou par message…..

Circulation de messages et machines hétérogènes Couche de services –Annuaires –Sécurité –Protocole dapplications Couche de transport –TCP –UDP Infrastructure informatique de distribution

Exemple CLIENT Essifun SERVEUR de Surnoms oter infrastructure Protocole dapplication ?

Communication client serveur CLIENT SERVEUR Préparation de la requête Envoi de la requête Attente du résultat …. Analyse du résultat reçu Connexion au serveur Attente de requêtes Analyse de la requête ….. Exécution …. Préparation de la réponse Envoi de la réponse

Exemple : annuaire des surnoms EssiFun SERVEUR de Surnoms enregistrer(« paul », « bug ») marshalling unmarshalling enregistrer(« paul », « bug ») = TRUE TRUE 1:Paul:bug ou ENR/nPaul/n/bug/n ou Objet Requête Seriablizable Différence entre un transport TCP et UDP pour le codage des données ?

Lhéritage de la programmation par objets Communication par envoi de messages Encapsulation et Interface Héritage et Composition

Objets = briques logicielles Assembler des briques élémentaires Réduire la complexité des systèmes dinformation Séparation entre interface et implémentation Représentation et types de données Mécanismes dabstraction

Séparation entre interface et implémentation séparation de la définition et de limplémentation : encapsulation interface : partie visible de lobjet implémentation : partie privée inaccessible depuis dautres objets interface = contrat entre lobjet et le monde extérieur

Séparation entre interface et implémentation Assemblage des objets dépend uniquement des interfaces, le changement local dun objet ne perturbe pas lensemble de lapplication. Importance de la nomenclature des objets substitution logique liée à la substitution physique

Représentation et Types de données Définition de nouveaux types Choix dun type pour une donnée (ex. montant) devient une contrainte sur la conception. Types de données Abstraits considérés comme des types de base

Mécanismes dabstraction Abstraction des données : essence du procédé de construction de systèmes d information à base d objets distribués par Classe et/ou Composition Des mises en œuvre différentes selon les cas

Que peut on automatiser ? A partir du protocole dapplications Au minimum, la phase de marshalling/unmarshalling (hétérogéneité des langages, des systèmes, etc) Selon les cas, le squelette du serveur les appels distants du client

Interaction Client/server : socket TCP Serveur (sexécutant sur lhôte) Client wait for incoming connection request connectionSocket = welcomeSocket.accept() create socket, port= x, for incoming request: welcomeSocket = ServerSocket() create socket, connect to hostid, port= x clientSocket = Socket() close connectionSocket read reply from clientSocket close clientSocket send request using clientSocket read request from connectionSocket write reply to connectionSocket TCP connection setup

Exemple : annuaire des surnoms boolean enregistrer(Personne p, Surnom sn) ListOfPersonne lister() boolean oter(Surnom surnom) AnnuaireEssi listePersonnes Enregistrer(AnneMarie,AM) lister() Client Serveur

Exemple : annuaire des surnoms interface : partie visible de lobjet (enregistrer, oter, lister, …) = méthodes publiques Java implémentation : partie privée inaccessible depuis dautres objets (listePersonnes : un vecteur de Personne ou un tableau ou ….) Interface distante = contrat entre lobjet et le monde extérieur (save impossible par exemple)

Circulation de messages et machines hétérogènes Couche de services Objets de lapplication qui résultent de la conception du modèle Couche de transport Responsable de ladministration des objets et de lacheminement des messages Infrastructure informatique de distribution

CLIENT SERVEUR Transport TCP IP... Service (marshalling..) transaction sécuriténommage Infrastructure ?

Objets distribués Un programme (objet) peut être à la fois client de certains serveurs et serveur dautres clients Il peut y avoir reconfiguration dynamique des rôles Client Serveur

Infrastructure Objets Distribués ClientClient ServeurServeur Objet1 Objet2Objet3

Générateurs RMIC / Orbix... IDL Int. Java Spécifications des données Générateurs Fichiers générés Stubs Skeletons Proxy (mise en œuvre de la sérialisation et désérialisation…)

RMI public interface Surnoms extends java.rmi.Remote { public Boolean enregistrer(String nom, String surnom) throws java.rmi.RemoteException, ServeurSurnoms.surnoms.ExisteDeja ; …. }

RMI Classes et Interfaces ClasseLocale SoucheSquelette ClasseDistante InterfaceDistante Remote Appel méthode m() Machine localeMachine distante InterfaceDistante

Comment activer des objets distribués ? Messages échangés entre objets = –Requêtes ou Résultats Certains envois de messages nattendent pas de résultats Requête = Destinataire + nom de méthode + Paramètres Résultat = Donnée ou indication dune erreur ou dune défaillance

Comment activer des objets distribués ? Mécanisme dexécution ou de transport –définit comment les messages sont véhiculés de lobjet client vers lobjet serveur (destinataire) –retrouver et activer les objets adéquats Un objet client a deux manières denvoyer des messages –invocation statique –invocation dynamique

Invocation statique Le nom de lobjet destinataire et le message sont connus au moment du développement Ne permet ni lajout ni le retrait dobjets dans les serveurs

Invocation dynamique Permet au programme client de –découvrir les objets à lexécution et les interfaces proposés par ces objets –construire dynamiquement messages et requêtes –envoyer et recevoir le résultat de telles requêtes Rend les systèmes réactifs et faciles à modifier

Invocation dynamique + surcharge flexibilité du code briques logicielles avec les mêmes messages pour des objets de différentes natures –définir de nouveaux objets sans modifier linterface –changements qui naffectent pas les clients

Invoquer les services dont il a besoin par envoi de requêtes Accès à lobjet destinataire par une référence à son implémentation par l interface Rôle du client Unités autonomes - solidité - robustesse - adaptation ID

Rôle de linfrastructure administre les implémentations, la création et la destruction dobjets réceptionne les requêtes, localise le serveur, vérifie son état et celui du destinataire active au besoin le serveur, lui envoie les données de la requête ramène les résultats au client doit être informée de larrêt dun serveur doit gérer la persistance

Rôle du serveur Administrer un flot de requêtes pour un ou plusieurs objets dont il a la responsabilité Ordonnancer la séquence des opérations de réponses à une requête

Rôle du serveur dobjets active si besoin lobjet destinataire recherche et exécute la méthode passe le résultat à linfrastructure plusieurs requêtes peuvent arriver simultanément arrêt du serveur : désactiver tous les objets et enregistrer leur état

Service de nommage Client ou Serveur ORB CosNaming:: NamingContext resolve_initial_references ("NameService"); conversion ajout,retrait,lecture,...

Enregistrer un objet Opération pour publier un Objet – en général, opération réalisée par le serveur Scénario Type 1. Créer un objet 2. Construire un chemin d accès (Name) 3. Appeler l opération « bind » ou « rebind » avec le chemin et la référence de l objet void bind (in Name n, in Object obj) raises (NotFound, CannotProceed, InvalidName, AlreadyBound);

Retrouver un objet Opération réalisée par un client ou un serveur Scénario type : –construire un chemin d accès (Name) –appeler l opération « resolve » avec le chemin –convertir la référence obtenue dans le bon type Object resolve (in Name n) raises (NotFound, CannotProceed, InvalidName)

Invocation de Méthode à distance : Zoom sur Java Remote Method Invocation Département SI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc À travailler seuls Concepts généraux Mise en œuvre Java

38 Client Serveur

39 Objets distribués 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 quils puissent s envoyer directement des messages ?

40 Objets distribués Un programme (objet) peut être à la fois client de certains serveurs et serveur dautres clients Il peut y avoir reconfiguration dynamique des rôles Client Serveur

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

42 Invocation de méthodes distantes Semble simple en théorie un peu plus complexe en réalité !!!

43 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 !!!

44 RMI Core API (intégré au JDK 1.1) –Gratuit –100 % Java Développé par JavaSoft Réservé aux objets Java Utilise les sockets et le protocole JRMP

45 Invocation de méthodes distantes

46 Stubs et encodage des paramètres le code dun objet client invoque une méthode sur un objet distant –Utilisation dun objet substitut dans la JVM du client : le stub (souche) de l objet serveur

47 Stubs et encodage des paramètres

48 Du côté du client Appel dune méthode du stub (de façon entièrement transparente) le stub construit un bloc de données avec –identificateur de lobjet distant à utiliser –description de la méthode à appeler –paramètres encodés qui doivent être passés puis il envoie ce bloc de données au serveur...

49 Du côté du serveur un objet de réception (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

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

51 Générateur de stubs Les stubs gèrent la communication ainsi que l'encodage des paramètres Processus évidemment complexe... Entièrement automatique –Un outil permet de générer les stubs pour les OD

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

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

54 Interfaces et classes prédéfinies

55 L interface HelloWorld import java.rmi.*; interface HelloWorld extends Remote { public String sayHello() throws RemoteException; } Interface = protocole d application

56 Rôle de l interface HelloWorld

57 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

58 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

59 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

60 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

61 Classe d implémentation HelloWorld HelloWorldImpl

62 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

63 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 de notre objet serveur ??? Référence sur un objet

64 –On pourrait appeler une méthode sur un autre objet serveur qui renvoie une référence sur le stub... –Mais quoi qu il en soit, le premier objet doit lui aussi être localisé (La poule et l œuf) !!! –On a alors recours a un Service de Nommage Localisation des objets de serveur

65 Obtention d'une première référence sur un objet distant : « bootstrap » à laide dun 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

66 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

67 –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écurité, 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

68 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

69 L objet serveur HelloWorld (coté serveur bien entendu…) –On a créé l'objet serveur et on a une variable qui le référence HelloWorld hello = new HelloWorldImpl(); –On va enregistrer l'objet dans le RMIRegistry Naming.rebind("HelloWorld",hello); –L'objet est désormais accessible par les clients Enregistrement d une référence

70 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("rmi:// r.com/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

71 –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 Remarque

72 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 –Le client –Et définir les permissions de sécurité et autres emplacements de classes... Conception, implémentation et exécution de l'exemple

73 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) créer les classes Stub ( rmic ) 5) démarrer rmiregistry et lancer lapplication serveur RMI 6) créer, compiler et lancer un programme client accédant à des OD du serveur Processus de développement

74 –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

75 –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("HelloWorld",hello); System.out.println("Attente d'invocations - CTRL-C pour stopper"); } catch(Exception e) { e.printStackTrace(); } Hello World : Le serveur

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

77 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 standard import 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

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

79 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

80 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é

81 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

82 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

83 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 !!!

84 On a vu ce qu'est une invocation de méthode distante On a vu le mécanisme des stubs, ainsi que l'encodage des paramètres On a vu le déploiement avec téléchargement des classes dynamiquement Nous avons même appliqué ces concepts au travers de l'exemple "HelloWorld » en RMI Conclusion intermédiaire

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

Erreurs classiques Stub inaccessible au rmiregistry java.rmi.ServerException: RemoteException occurred in server... java.rmi.UnmarshalException: error unmarshalling... java.lang.ClassNotFoundException: Le stub est accessible au serveur MAIS PAS AU rmiregistry Attention à lordre dappel : génération des stubs et appel du rmiregistry rmiregistry pas lancé java.net.ConnectException Oubli du constructeur pour le RemoteObject unreported exception java.rmi.RemoteException in default constructor public class HelloImpl extends UnicastRemoteObject implements Hello { ^ rmiregistry déjà lancé java.rmi.server.ExportException: Port already in use: 1099 On peut lancer un autre registry mais sur un autre port.

Erreurs classiques La classe dimplémentation n'hérite pas de UnicastRemoteObject S'il n'hérite pas de UnicastRemoteObject, il n'est pas Remote donc on lui demande d'être Serializable... Trouble: java.rmi.MarshalException: error marshalling arguments; nested exception is: java.io.NotSerializableException: CalculatorImpl ATTENTION aux CLASSPATH et package Java

Une autre utilisation du rmiRegistry import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; Client Registry registry; registry = LocateRegistry.getRegistry(); Hello hello = (Hello) registry.lookup("coucou"); Serveur LocateRegistry.createRegistry(port); // port=1099 Hello stub = (Hello) UnicastRemoteObject.exportObject(unHello, 0); Naming.rebind("rmi://"+"localhost"+":"+ port +"/coucou", stub); 88

Java et la réflexivité

Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing Java program. This feature is extremely powerful and has no equivalent in other conventional languages such as C, C++, Fortran, or Pascal. Glen McCluskey has focused on programming languages since He consults in the areas of Java and C++ performance, testing, and technical documentation.

Réflexivité en Java ? La réflexivité en Java permet à un programme Java de sexaminer en cours dexécution de manipuler ses propriétés internes. Par exemple, une classe Java peut obtenir le nom de tous ses membres. Utilisation connue de la réflexivité : lédition sous Eclipse Loutil utilise la réflexivité pour obtenir liste des méthodes publiques qui peuvent être envoyées à une instance dune classe

Que peut on faire ? Obtenir des informations sur les classes Simuler lopérateur instanceof Découvrir la liste et le descriptif des méthodes Obtenir des informations sur les constructeurs Avoir des informations sur les variables Invoquer des méthodes, des constructeurs, affecter des variables Créer des objets et des tableaux dynamiquement lors de l exécution du programme sans connaître à la compilation le nom et les arguments dune méthode / constructeur le nom de la variable le type des objets, des tableaux….

Réflexivité = un package Java java.lang.reflect.* des classes : Object AccessibleObject Constructor Field Method Array InvocationTargetException Modifier ReflectPermission une interface : Member

Exemples concrets dapplications En RMI ? Que font les stubs ? Comment peut on utiliser la réflexivité pour les écrire ? 1.Trouver la liste des méthodes Remote 2.Du côté client 1.Sérialiser et envoyer sur le réseau 2.Attendre le résultat sérialisé et le restructurer 3.Dou côté du serveur 1.Déserialiser ce qui est reçu et invoquer la méthode avec les paramètres 2.Récupérer le résultat, le sérialiser et lenvoyer au client

Oui mais comment ? Comment travailler avec les classes du package reflect ? Obtenir un objet java.lang.Class Récupérer des informations sur la classe Utiliser lAPI de reflect Illustration à partir de lexemple

Classe Class Les instances de Class représentent les classes et les interfaces dune application Java. Tous les tableaux sont aussi instances de Class (type des éléments, dimension). Les types primitifs (boolean, byte, char, short, int, long, float, double) et le mot clé void sont aussi des objets Class. Cette classe na pas de constructeur public. Les instances sont créées automatiquement par la VM lorsque les classes sont chargées et par la méthode defineClass des class loader.

Utiliser lAPI de reflect Par exemple : Class c = Class.forName("java.lang.String"); Method m[] = c.getDeclaredMethods(); System.out.println(m[0])); pour manipuler linformation

classe AccessibleObject et interface Member AccessibleObject : Classe de base de Field, Method et Constructor. Permet de supprimer ou de valider la vérification faite par défaut concernant les contrôles daccès. Ces vérifications (sur private, public, package..) sont effectuées lorsquon affecte ou lit des champs, lorsquon invoque une méthode et lorsquon crée une instance. Member : interface qui réifie les informations communes à un membre (champ ou méthode) ou à un constructeur.

Classes Method, Field et Constructor Method fournit les informations et les accès à une méthode (de classe, dinstance ou abstraite) dune classe ou dune interface. Field fournit les informations et accès dynamiques aux champs (static ou dinstances) dune classe ou dune interface. Constructor fournit des informations et des accès à un constructeur dune classe.

Les méthodes dune classe ? 1.récupérer l objet Class que lon souhaite observer, 2.récupérer la liste des objets Method par getDeclaredMethods : méthodes définies dans cette classe (public, protected, package, et private) getMethods permet dobtenir aussi les informations concernant les méthodes héritées 3.A partir des objets méthodes il est facile de récupérer : les types de paramètres, les types dexception, et le type de largument retourné sous la forme dun type fondamental ou dun objet classe.

Exemple de programme Class cls = Class.forName("method1"); Method methlist[] = cls.getDeclaredMethods(); for (int i = 0; i < methlist.length; i++) { Method m = methlist[i]; System.out.println("name = " + m.getName()); System.out.println("decl class = " + m.getDeclaringClass()); Class pvec[] = m.getParameterTypes(); for (int j = 0; j < pvec.length; j++) System.out.println("param #" + j + " " + pvec[j]); Class evec[] = m.getExceptionTypes(); for (int j = 0; j < evec.length; j++) System.out.println("exc #" + j + " " + evec[j]); System.out.println("return type = " + m.getReturnType());}

Exemple dexécution name = f1 decl class = class method1 param #0 class java.lang.Object param #1 int exc #0 class java.lang.NullPointerException return type = int name = main decl class = class method1 param #0 class java.lang.String return type = void public class method1 { private int f1(Object p, int x) throws NullPointerException {……..} public static void main(String args[]) {….}

Invocation des méthodes par leur nom Equivalent du apply de Scheme pour invoquer une méthode m dont le nom est spécifié à lexécution (dans le cadre de lenvironnement de développement des JavaBeans par exemple) 1.Trouver une méthode dans une classe getMethod à partir des types de ses paramètres et de son nom. 2. La stocker dans un objet Method 3.Construire la liste des paramètres dappel 4. Faire lappel Si on manipule un type fondamental à lappel ou au retour lencapsuler dans la classe correspondante (int, Integer)

Exemple de programme Class cls = Class.forName("method2"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE; Method meth = cls.getMethod("add",partypes); method2 methobj = new method2(); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47); Object retobj = meth.invoke(methobj, arglist); Integer retval = (Integer)retobj; System.out.println(retval.intValue())

Exemple dexécution public class method2 { public int add(int a, int b) { return a + b; } public static void main(String args[]) {…… …… } ?

Pour ne plus déployer les classes du serveur chez le client Utilisation des chargeurs de classes qui téléchargent des classes depuis une URL Utilisation d un serveur Web qui fournit les classes Ce que ça change Bien entendu, les classes et interfaces de l objet distant ne changent pas Le code du serveur ne change pas le client et la façon de le démarrer sont modifiés Et lancer un serveur Web pour nos classes Chargement dynamique

Classe ClassLoader ClassLoader est une classe abstraite. Un class loader est un objet responsable du chargement des classes Un nom de classe donné, il peut localiser ou générer les données qui constituent une définition de la classe. Chaque objet Class a une référence à un ClassLoader qui le définit. Applications implémentent des sous classes de ClassLoader afin détendre la façon de dynamiquement charger des classes par la VM. (utilisation de manager de sécurité, par exemple)

ClassLoader ? En UNIX la VM charge les classes à partir des chemins définis dans CLASSPATH. Certaines classes peuvent être obtenues à partir dautres sources, telles que le réseau ou construites par une application. La méthode defineClass convertit un tableau doctets en une instance de Class. Instances pouvant être créées grâce à newInstance Les méthodes et constructeurs créés par un class loader peuvent référencer dautres classes (loadClass du class loader de cette classe).

Exemple de chargement de classe Un class loader qui permet de charger des fichiers de classes via le réseau ClassLoader loader=new NetworkClassLoader(host,port); Object main= loader.loadClass("Main", true).newInstance(); …. NetworkClassLoader doit définir findClass et loadClassData pour charger et defineClass pour créer une instance de Class.

Chargement dynamique des classes Problème de sécurité Le programme client télécharge du code sur le réseau Ce code pourrait contenir des virus ou effectuer des opérations non attendues !!! Utilisation d un gestionnaire de sécurité pour les applications de clients RMI Possibilité de créer des gestionnaires de sécurité personnalisés pour des applications spécifiques RMI fournit des gestionnaires de sécurité suffisants pour un usage classique

111 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

Mettre les classes Download dans le répertoire des documents Web du serveur Web, accessibles via une URL –le chargeur de classes ira chercher les classes à un emplacement de type server.com/classes/HelloWorldImpl_Stub.class }; Hello World : Démarrage du serveur Web

–Le programme Java client doit pouvoir se connecter aux ports de la base de registres RMI et des implémentations des objets de serveur, ainsi qu'au port du serveur Web –Fichier client.policy grant { permission java.net.SocketPermission "*: ", "connect,resolve"; permission java.net.SocketPermission "*:80", "connect"; }; Hello World : Politiques de sécurité

Le client intègre un gestionnaire de sécurité RMI pour les stubs téléchargés dynamiquement import java.rmi.*; import java.rmi.server.*; public class HelloWorldClient { public static void main(String[] args) { try { // Installe un gestionnaire de sécurité RMI System.setSecurityManager(new RMISecurityManager()); 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); } catch(Exception e) { e.printStackTrace(); } Hello World : gestionnaire de sécurité RMI

–1) Lancer la base de registres RMI (elle doit pouvoir accéder aux classes Download - CLASSPATH) > rmiregistry –2) Lancer le serveur Web servant les fichiers de classes Download –3) Lancer le serveur (les classes Server doivent être accessibles) > java HelloWorldServer Création de l'objet serveur... Référencement dans le RMIRegistry... Attente d'invocations - CTRL-C pour stopper Hello World : Démarrage coté serveur

–Le client doit pouvoir se connecter à des machines distantes pour la base de registres RMI, les objets de serveur ainsi que le serveur Web On doit lui fournir un fichier client.policy –Le client doit bien connaître l'emplacement des classes afin de pouvoir les télécharger On va le lui préciser lors du lancement > java -Djava.security.policy=client.policy -Djava.rmi.server.codebase= HelloWorldClient Hello World : Démarrage coté client

Objets Distribués et Composants Les applications actuelles et futures

Illustrations avec Qui : Corba / COM-DCOM / Java RMI…

Langages de spécifications Spécifications des types de données qui transitent sur le réseau XDR et RPC de SUN Protocole := CHOICE { requete [0] REQUETE, reponse [1] REPONSE } Programme reqrep { version { REPONSE rerep(REQUETE) = 1 }= 1 } = ASN.1 et norme ISO

Exemple : annuaire des surnoms XDR et RPC de SUN Protocole := CHOICE { enregistrerReq [0] SEQUENCE{PrintableString nom, PrintableString surnom} enregistrerRep[1] BOOLEAN, listerReq [2] NULL, listerRep [3] SET OF Personnes, ….} Programme surnoms { version { boolean enregistrer(nomSurnom) = 1; listePersonnes lister(void)=2 }= 1 } = ASN.1 et norme ISO

Générateurs de Stubs RPCGEN / MAVROS ASN1 XDR Librairie marshalling et unmarshalling squelettes du client et du serveur Spécifications des données Générateurs Types de données C Lisp Java Types de données C Fichiers générés

Introduction de services Gestionnaires de noms (x500, nis, dns…) Synchronisation (transaction …) Sécurité

Des Annuaires de Noms Yellow Pages X500 LDAP

Implémentation des objets distribués Corba indépendant des langages de programmation Projections C,C++, Java Un langage de Spécification IDL Orienté C++ Tout Java

CORBA, DCOM et JAVA une interface = une unité élémentaire héritage des interfaces aucune interface imposée normalisation des interface au moins une interface : Iunknown non transmissible par héritage composition dinterfaces héritage de classe implémentation de plusieurs interfaces possibles

Générateurs RMIC / Orbix... IDL Int. Java Spécifications des données Générateurs Fichiers générés Stubs Skeletons Proxy (mise en œuvre de la sérialisation et désérialisation…)

CORBA module Surnoms { typedef string Nom ; struct Personne {Nom nom; string surnom;}; typedef sequence ListePersonnes; interface Surnoms{ exception ExisteDeja{string surnom;}; boolean enregistrer(in Personne personne) raises (ExisteDeja); ….. };

Surnoms.java Compilation interface IDL Client StubForSurnoms.java _SurnomsImplBase.java Serveur SurnomsImpl.java Client.java Serveur.java A écrire Généré 1- Exemple introductif Surnoms.idl Compilateur IDL/Java Répertoire grid Répertoire Surnoms I SurnomsHelper.java SurnomsHolder.java jidl Surnoms.idl

RMI public interface Surnoms extends java.rmi.Remote { public Boolean enregistrer(String nom, String surnom) throws java.rmi.RemoteException, ServeurSurnoms.surnoms.ExisteDeja ; …. }

RMI Classes et Interfaces ClasseLocale SoucheSquelette ClasseDistante InterfaceDistante Remote Appel méthode m() Machine localeMachine distante InterfaceDistante

Un peu plus sur linfrastructure transport des messages localisation des serveurs et des objets persistance ORB pour CORBA norme Corba 1 DCOM pour OLE non formelle JDK

Transport des messages Références aux objets –identifiant (libre choix d implémentation dans le norme CORBA) –nombres codés sur 128 bits en OLE –url Uniform Resource Locator en Java RMI Performances différentes et incompatibilités entre ORBs et entre ORB et COM

Scénario d obtention de la référence du service de nommage Client ou Serveur ORB CosNaming:: NamingContext resolve_initial_references ("NameService"); conversion ajout,retrait,lecture,...

Enregistrer un objet Opération pour publier un Objet – en général, opération réalisée par le serveur Scénario Type 1. Créer un objet 2. Construire un chemin d accès (Name) 3. Appeler l opération « bind » ou « rebind » avec le chemin et la référence de l objet void bind (in Name n, in Object obj) raises (NotFound, CannotProceed, InvalidName, AlreadyBound);

Retrouver un objet Opération réalisée par un client ou un serveur Scénario type : –construire un chemin d accès (Name) –appeler l opération « resolve » avec le chemin –convertir la référence obtenue dans le bon type Object resolve (in Name n) raises (NotFound, CannotProceed, InvalidName)

Interaction Client Enregistreur client serveur clientregistre Lookup : où est objetDistant ? stub Il est ici Envoyez le stub Le voici stubsquelette objet Distant result = objetDistant.m() result RMIRegistry + ClassLoader

Interface avec linfrastructure Un peu de vocabulaire Coté client : –stub en CORBA –proxy en OLE –stub/proxy en Java Côté Serveur : –stub en OLE –skeleton en CORBA –implémentation dune interface en RMI BOA Objects Adaptaters

Mécanisme de Transport : Client - Serveur Appel direct : DLL (in process - utilisation du même espace mémoire) Appel indirect : – LRPC (application sur la même machine) passe par le proxy –RPC (sur 2 machines différentes) IIOP en Corba

Invocations Invocations statiques –IDL en CORBA stub + skeleton –En OLE appel direct si in process proxy + stub si application fournis uniquement pour les applications MicroSoft Versions récentes définition du langage ODL IDL et ODL sont incompatibles

Invocations Invocations dynamiques –DII en CORBA –IDispatch en OLE –java reflect Du ressort de linfrastructure

CORBA vs OLE définition du serveur très générale laissée à limplémentation flexibilité primordiale pour lintégration de systèmes (BDD…) processus formel avec lOMG un serveur est une application ou une DLL stratégie commerciale et pratique

Services et Objets Distribués Services normalisés Seulement certains sont implémentés Naming, Trading, Event Le programmeur doit les connecter… Des services en Programmant avec Java Securité,Threads, Événements Url et Web Non intégrés à RMI

Les points communs des middlewares en objets distribués (aspect réseau) Adressage : à tout objet doit être affecté une référence unique Transport : pour établir une communication entre 2 nœuds et transmettre une requête Marshalling : transformation de la requête pour passer sur le réseau

Les points communs des middlewares en objets distribués (aspect réseau) Activation : activer les implémentations des objets Dispatching : gestion des threads Protocol : transmission des requêtes entre exécutables Des services communs Services de nommage, Interface repository.....

Les points communs des middlewares en objets distribués (aspect objet) Encapsulation : Interdire l'accès direct au contenu de l'objet Interface : Permettre l'évolution du code Héritage / Composition : Gérer les versions Envoi de messages Privilégier les communications synchrones

Un bref comparatif OrigineMicrosoftOMGJavaSoft ArchiCOM DCOM IDL ORB IIOP Java RMI Applet InterfacesIUNKnown prédéfinies Définies en IDL Définies en Java

Un bref comparatif Interface+Agrégation composition Héritage extends LangageC++C Smalltalk Java Infrastr.Proxy stub Stub skeleton Proxy R O

Un bref comparatif ServeurAppli DLL Appli Biblio BDD Appli Java ClientAppli DLL Appli Biblio BDD Appli Java Applets CréationIFactoryInstancié en LOO Instancié En Java

Un bref comparatif Appel dyn. IDispatchDIIIntrosp. beans Ident.Reg. OLEService de nommage URL Comm.DCOM DCE IIOPRMI (TCP/IP)

Des objets distribués aux composants Illustrations : Qui : / Corba3 CCM/ Web Services (.net, J2EE) / EJBs …

Quels Composants ? Une vision « simplifiée » : les Web Services Des composants « normalisés » : CCM Des composants pratiques : EJB Et tout ce que l'avenir nous réserve : OpenCCM, Fractal ….

Une « unité logique applicative » Une «librairie» fournissant des données et des services à dautres applications. Un objet métier déployé sur le web (vision objet) Un « module » ou « composant » (Application avec JAX-RPC : un composant simple avec une interface RMI ) Une sorte d'objet… plutôt qu'un composant Un Service Web, cest quoi ?

Architecture globale

Un langage de description : WSDL Une infrastructure : Le Web et http Une communication par envoi de messages : SOAP Du marshalling : XML Un service de nommage « dynamique » : UDDI Points communs avec les middlewares objets

Annuaire UDDI Client XML 5 : Jai compris comment invoquer ton service et je tenvoie un document XML représentant ma requête Serveur 2 : Jai trouvé! Voici le serveur hébergeant ce service web 3 : Quel est le format dappel du service que tu proposes? Contrat SOAP Contrat SOAP 4 : Voici mon contrat (WSDL) XML 6 : Jai exécuté ta requête et je te retourne le résultat 1 : Je recherche un service WEB Cycle de vie dutilisation

Cycle de vie plus complet… Déploiement du service Web Enregistrement du service Web Découverte du service Web Invocation du service Web par le client

Pour être de vrais composants… - Description des interfaces requises - Langage pour gérer le flux dexécution : WSFL - des services spécifiques - sécurité (SAML, …) - transactions (BTP, …) - une découverte des services web (W3C)

Des environnements intégrés.net Toute la mécanique est cachée On peut se concentrer sur la conception Aide à l'assemblage ? Des adeptes et des sceptiques –Passage à l'échelle ? –Evolution ? –Interopérabilité ?

Une brique permettant la programmation par assemblage Une solution facilitant le déploiement, la gestion du cycle de vie des applications logicielles Une meilleure intégration des services plus qu'un objet Un composant, cest quoi ?

Exemple des différents éléments E

Exemple de modèle de composant

EJB – CORBA 3: Points communs avec les middlewares objets Langages de description : CIDL ou Interfaces Java Infrastructure : RMI / ORB Marshalling : repose sur Corba / RMI Nommage : Home ++ Interface : Héritage + Composition

EJB – CORBA 3: Apports Interfaces entrées et sorties : ports requis et offerts Conteneur : intégration des propriétés non Fonctionnelles (sécurité, persistance, transaction) Home : fabrique et navigation Communication par envoi de message et notification (événement)

Un vrai cycle de vie Fichier de déploiement Packaging d'assemblage Approche déclarative basée sur XML

Prochaine invasion dans la lignée ? Approche composant revisitée : Open CCM : une meilleure solution CCM + MDA (+ d'abstraction des infrastructures, projections vers des middlewares connus…) Des Composants à conteneurs ouverts (travaux de recherche) Des composants adaptables (fractal)

Les problèmes à résoudre encore Problèmes dinteropérabilité –RMI et Corba en Java –entre le monde Microsoft et le reste Arrivée des Web Services : la solution ? Les composants encore nouveaux…. –les Enterprise Java Beans –Corba Components –et aussi C# et net

Les plus grosses difficultés Sont conceptuelles –Comment choisir les composants adaptés ? (manque de sémantique, Web sémantique) –Comment accepter plus de services ? (propriétés non fonctionnelles) Etre plus architecte que programmeur ….

Quelques interrogations ? Comment choisir le bon middleware (intergiciel) ? Il y en a de plus en plus Corba, RMI, DCOM, DSA + CCM, J2EE + Web Services,.net.... Savoir les comparer Identifier les points communs Interopérabilité : XML une solution suffisante ?

Des Critères de Comparaisons Autour du concept objet ? Communication synchrone ou asynchrone ? Description via des interfaces ou des messages ? Communication directe ou indirecte ? Spécifique ou indépendant langage ? Possibilité de transformation de messages ou non ? Protocole de communication binaire ou textuelle ? Prise en compte de QoS ou non ? (transaction, sécurité....)

Comment faire interopérer les middlewares ? Aller vers un middleware standard ? (J2EE / Corba) Construire une couche au dessus des middlewares ? des familles de middlewares, des middlewares génériques (Jonathan, PolyOrb,...) Avoir une approche architecturale ? des design patterns Faire interopérer des middlewares existants? M2M

Lavenir ? Après les approches par composants, des middlewares au dessus de JMS Une réflexion de plus haut niveau pour sortir les schémas communs extérioriser quand et comment on les utilise ne pas confondre les problèmes avec XML