Plan. Les objets répartis. Sources. Cours. Introduction. Pierre Courtieu. Remote method invocation (JAVA/RMI)



Documents pareils
RMI le langage Java XII-1 JMF

Remote Method Invocation (RMI)

Remote Method Invocation en Java (RMI)

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Remote Method Invocation Les classes implémentant Serializable

Calcul Parallèle. Cours 5 - JAVA RMI

Programmation répartie RPC & RMI

Intergiciel - concepts de base

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Java - RMI Remote Method Invocation. Java - RMI

Conception de serveurs d'applications ouverts

Synchro et Threads Java TM

Gestion distribuée (par sockets) de banque en Java

Premiers Pas en Programmation Objet : les Classes et les Objets

Projet gestion d'objets dupliqués

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Programmation réseau avec Java. 3/7 RMI, un peu de sécurité et CORBA

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmer en JAVA. par Tama

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Cours 1: Java et les objets

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Programmation Objet Java Correction

2 Chapitre 1 Introduction

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

TP1 : Initiation à Java et Eclipse

Auto-évaluation Programmation en Java

Systèmes répartis. Fabrice Rossi Université Paris-IX Dauphine. Systèmes répartis p.1/49

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Un ordonnanceur stupide

Dis papa, c est quoi un bus logiciel réparti?

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Java Naming and Directory Interface

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Threads. Threads. USTL routier 1

INITIATION AU LANGAGE JAVA

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Modèle client-serveur Plan. Modèle client-serveur. Modèle client-serveur définition. Modèle client-serveur communication par messages.

Initiation à JAVA et à la programmation objet.

GEI 465 : Systèmes répartis

Développement, déploiement et sécurisation d'applications JEE

Introduction : les processus. Introduction : les threads. Plan

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

Corrigé des exercices sur les références

TD/TP PAC - Programmation n 3

CORBA. (Common Request Broker Architecture)

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Problèmes liés à la concurrence

Composants Logiciels. Le modèle de composant de CORBA. Plan

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Software Engineering and Middleware A Roadmap

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

NFP111 Systèmes et Applications Réparties

ACTIVITÉ DE PROGRAMMATION

Création d une application JEE

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Chapitre I Notions de base et outils de travail

Java DataBaseConnectivity

Architecture applicative et Cartographie

Cours de Systèmes d Exploitation

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Exercices INF5171 : série #3 (Automne 2012)

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Etude critique de mécanismes de sécurité pour l architecture Jini

Java 1.5 : principales nouveautés

TD/TP PAC - Programmation n 3

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

Tp 1 correction. Structures de données (IF2)

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP1. Outils Java Eléments de correction

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Chapitre VI- La validation de la composition.

Mise en œuvre des serveurs d application

Une introduction à Java

Une introduction à la technologie EJB (2/3)

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

OS Réseaux et Programmation Système - C5

Messagerie asynchrone et Services Web

Généralités sur le Langage Java et éléments syntaxiques.

Architectures n-tiers Intergiciels à objets et services web

Corrigés des premiers exercices sur les classes

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Java Licence professionnelle CISII,

Le modèle client-serveur

Plan du cours. Historique du langage Nouveautés de Java 7

Chapitre VII : Principes des réseaux. Structure des réseaux Types de réseaux La communication Les protocoles de communication

Manuel d implémentation des Web Services Sous Axis1 et Axis2/Tomcat/linux. Par Pr Bouabid EL OUAHIDI

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Programmation par composants (1/3) Programmation par composants (2/3)

Traitement de données

Java et les bases de données

Étude de l interopérabilité de deux langages de programmation basée sur la machine virtuelle de Java

Développement Logiciel

Meta Object Facility. Plan

La base de données XML exist. A. Belaïd

Transcription:

Les objets répartis Pierre Courtieu Plan Introduction Les applications distribuées Introduction Les applications distribuées Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Exemple complet: Calcul d âge Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Exemple complet: Calcul d âge Conclusion Conclusion Cours Sources Pré-requis: Objets, Java Objectifs: Objets distribués Problématiques des applications distribuées Apprendre à mettre en œuvre un outil: Java RMI Conclusion: Facile à mettre en place Très puissant Mais très difficile à programmer Documentation Java Jean-Marc Farinone (CNAM) http://cedric.cnam.fr/ farinone/java/ Jean-Luc Massat (Université de la Méditerranée) Olivier Perrin (LORIA) http://www.dil.univ-mrs.fr/ massat/ens/java/rmi.html http://www.loria.fr/ operrin/licencepro/files/rmi2005.pdf Michel Cosnard (INRIA) http://www-sop.inria.fr/mascotte/michel.cosnard/

Service réparti Client/serveur Efficacité, répartition des données, architecture client/serveur Client Client Client Cas très fréquent: Service utilisé par plusieurs personnes travaillant sur plusieurs machines Architecture clients/serveur: Un client demande un service au serveur RESEAU Messages Messages Le serveur effectue un traitement puis répond Exemple: serveur = banque, clients = clients, service = dépôt, retrait, solde... Serveur Les objets fonctionnent en clients/serveur! Plan Introduction Clients = objets appelant les méthodes d un autre Serveur = objet dont la méthode est appelé Message = appels de méthodes Idée sous-jacente de l approche objet depuis le début Pas si simple Les applications distribuées Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Exemple complet: Calcul d âge Conclusion

Application distribuée (O. Perrin) Parallélisme, distribution Selon Michel Cosnard: Fédération de programmes distribués qui coopèrent Définition commune: Exécution de plus d un processus à un moment donné, les processus communiquent Différence: Un programme est parallèle si les processus interagissent à l aide de variables partagées. Un programme est distribué si les processus interagissent en échangeant des données Synchrone/asynchrone Synchrone/asynchrone Un programme (parallèle ou distribué) est composé de processus séquentiels. L exécution de chaque processus passe successivement par deux phases: Une phase où le processus ne communique pas Une phase où le processus communique Synchrone: Horloge globale, synchronisation de tous les processus à chaque phase a.a b.b = (a, b).(a, b ) Exemple: 1. Calculer 2. lire la valeur partagée X 3. calculer 4. modifier la valeur partagée X 5.... 1. Calculer 2. requête réseau 3. calculer 4. envoi réseau 5.... Asynchrone: Pas d horloge globale, chaque traitement local prend un temps quelconque a.a b.b = a.a.b.b ou a.b.b.a ou b.a.b.a... entrelacement synchronisation à la main par envoi de message, mutex, sémaphores

Accès concurrent aux données Accès concurrent aux données Deux processus accèdent à la même donnée partagée au même moment 2 Lectures simultanées? 1 lecture + 1 écriture simultanées? 2 écritures simultanées? Comportement prévisible mais probablement incorrect Pire: Les copies d une valeur partagée ne sont pas mises à jour! Exemple classique: la banque Processus 1 lit le solde: 150e Processus 2 lit le solde: 150e Processus 2 retire 100e Processus 2 stocke le solde: 50e Processus 1 soustrait 100e, le solde devient 50e Processus 1 stocke le solde: 50e Solution: le mutex Mutex: exemple Solution classique: chaque ressource est munie d un verrou (mutex) Un processus prend le verrou lorsqu il désire que personne ne modifie la valeur partagée pendant qu il effectue un traitement particulier (section critique) Si le verrou est déjà pris: mise en attente du processus Il rend le verrou lorsque la section critique est finie Processus 1 prend le mutex du solde Processus 1 lit le solde: 150e Processus 2 demande le mutex mais ne l obtient pas attente Processus 1 soustrait 100e, le solde devient 50e Processus 1 stocke le solde: 50e Processus 1 rend le mutex du solde Processus 2 prend le mutex du solde Processus 2 lit le solde: 50e Processus 2 retire 100e Processus 2 stocke le solde: -50e Attention aux blocages!

Définitions Inter-blocage exemple Progression : Un processus d un système synchrone progresse (normalement) si, à l issue de l exécution d une phase, l exécution de la phase suivante a lieu au bout d un temps fini. Viabilité : Un système asynchrone est viable si tous les processus, qui le composent, progressent. Inter-blocage : Un système asynchrone est en inter-blocage si aucun des processus, qui le composent, ne peut progresser. Famine : Si, dans un système asynchrone qui n est pas en inter-blocage, un processus ne peut plus progresser, alors il est en situation de famine. Équité : Un système asynchrone viable est équitable si, pour tout processus, la durée entre deux phases consécutives est bornée. Accès à une ressource géré par un mutex: obtenir / libérer P 1 : X 1 X 1 attente M 1 X 2 attente M 2 Requiert M 1 obtient M 1 obtient M 2 Requiert M 2 Y 1 Libère M 1 Libère M 2 attente M 2 attente M 1 P 1 : X 2 Requiert M 2 Requiert M 1 Y 2 Libère M 2 Libère M 1 Difficultés Inter-blocage Facile d écrire un programme réparti sans inter-blocage (synchronisation partout, sections critiques partout) Difficile d écrire un programme sans inter-blocage et correct Extrêmement difficile d écrire un programme sans inter-blocage, correct et efficace Extrêmement difficile de s assurer qu un programme réparti est sans inter-blocage Des trucs: Toujours acquérir les mutex dans le même ordre Ne pas partager les mutex entre des processus de priorités différentes MODÉLISER avant de programmer! Ne pas compter sur le langage de programmation Extrêmement difficile de s assurer qu un programme réparti est correct

Pathfinder 1997 Problèmes à prendre en compte Données systématiquement perdues, à cause d une mémoire partagée protégée par un mutex et utilisée par trois routines: Gestion de bus sur cette mémoire: grande priorité Écriture en mémoire partagée: basse priorité Communication (lecture seulement): priorité moyenne l écriture (pr. faible) s appropriait le mutex La gestion du bus (pr. haute) attendait sur ce mutex La commutation de tâches laissait donc alors la routine de communication (pr. moyenne) s exécuter et laissait le mutex bloqué Lorsque la gestion du bus était bloqué depuis trop longtemps, une protection effectuait un redémarrage du système Disponibilité du service (non blocage + équité) Sécurité Tolérance aux pannes Transparence Modèles Plan Introduction Client/serveur Peer-to-Peer Application + coordination sur plusieurs nœuds Communication par messages Files de messages Communication par événements Publish/subscribe Composants Java Bean, EJB Agents mobiles Agglet, Voyager Mémoires virtuelles partagées JavaSpaces Les applications distribuées Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Exemple complet: Calcul d âge Conclusion

Objets/Réseau Solutions Deux protocoles/api basés sur les objets: Sans les objets: RPC (Remote procedure call): Protocole(s) permettant de lancer une procédure d un programme sur un ordinateur distant Avec objets: RMI (Remote method invocation) / CORBA Appel de procédures distantes / méthodes d objets distants Le plus transparent possible pour le programmeur Toto toto = new Toto(); String x = z.calcul(toto); y = z.verifie(x, 30); CORBA Multi-langage Compliqué Java/RMI Assez simple (Remote method invocation = couche d appel de méthodes à distance) Tout-java mais Java interagit (JNI) avec C C++ fortran... Deux machines virtuelles communiquent Protocoles utilisant TCP/IP: JRMP (Java Remote Method protocol) RMI-IIOP (Internet Inter-ORB Protocol, compatible CORBA) RMI modèle RMI Architecture(incomplète) Client Client/serveur synchrone ou asynchrone (attente du résultat ou non) Pas de mémoire partagée (programmation distribuée) RESEAU Invocations Serveur

Interface du serveur Héritage Quelles méthodes du serveur peuvent être invoquées? Typage correct des appels distants? Réponse naturelle: Il faut définir le service par une interface: Implantée par le serveur Connue du client héritant (extends) de l interface java.rmi.remote Bonne utilisation de l héritage: Il existe des classes qui implantent cette interface: ex: java.rmi.server.unicastremoteobject Dont on héritera (extends) pour implanter (implements) l interface du serveur extends Serveur_Interface implements Interface Java.rmi.Remote Classe implements java.rmi.server.unicastremoteobject Librairie extends Programme Serveur_Impl Interface du serveur Architecture Client public interface serveurinterface extends java.rmi.remote { public typret meth(typ1 param_typ_1, typ2 param_typ_2) throws java.rmi.remoteexception; Le client invoque les méthodes de l interface. Comment connaître l adresse du serveur, le port sur lequel celui-ci attend les connexions... RESEAU Recherches d objets Invocations Serveur de noms (rmiregistry) Enregistrements d objets Serveur Serveur de noms

Serveur de noms (rmiregistry) Serveur de nom(rmiregistry) Sous linux: rmiregistry Sous windows start rmiregistry Rend le code du client plus indépendant du serveur S exécute sur une machine M du réseau URL d un objet enregistré: rmi://<ipdem>/nom Enregistrement (côté serveur): Naming.rebind("rmi://serveurDeNom/nomObjetServeur", objetserveur); Récupération (côté client): Naming.lookup("rmi://serveurDeNom/nomObjetServeur"); Quel type de retour? java.rmi.remote Une classe qui: Implante (implements) java.rmi.remote Implante le serveur sans exécuter les méthodes du serveur localement Cette deuxième condition n est pas vérifiable par typage (cast) Architecture Paramètres Client Serveur de noms Les objets passés en paramètre sont sérialisés Les objets passés en retour sont sérialisés RESEAU Remote Name Sérialisable Name + Remote Même si ce sont des objets distants? Non! On transmet autre chose: ce qu il faut pour pouvoir appeler les méthodes distantes de l objet Pour que le Typage soit correct: on doit transmettre un objet (sérialisé) de même type que l objet distant La classe souche (stub) implante la même interface de l objet distant Serveur

STUB (SOUCHE) / SKEL (squelette) Héritage Engendrés automatiquement (rmic), ou dynamiquement (Java 1.5) Classe Stub implantant l interface du serveur Chaque méthode de l interface est implantée par un code réseau extends Java.rmi.Remote Interface Classe public final class ServeurImpl_Stub extends java.rmi.server.remotestub implements serveurinterface, java.rmi.remote {... // methods from remote interfaces Serveur_Interface implements // implementation of meth(typ1,typ2) public typret meth(typ1 param_typ_1, typ2 param_typ_2) throws java.rmi.remoteexception {... Classe Skel implantant l aspect écoute et dispatching du serveur implements Serveur_Impl_Stub java.rmi.server.unicastremoteobject Librairie extends Programme Serveur_Impl Serveur_Skel Architecture RemoteException Client Serveur de noms Invocations STUB Recherches de stub NAME, STUB RESEAU Invocations Enregistrements de stubs STUB SKEL Serveur

Transport Classes de sérialisation Transmission des objets par le réseau Passage d objets en paramètres retours de résultats Les Transferts se font par TCP/IP Protocole propriétaire: JRMP, Java Remote Method Protocol Permet d écrire une classe en sortie (fichier, flux) Il suffit de faire hériter la classe de l interface Serializable (ni méthode ni champ) public MaClasse implements Serializable { private String monpremierattribut; private Date monsecondattribut; private long montroisiemeattributs; Port 1099. Classes de sérialisation //... d éventuelles méthodes... Transmission des objets Plan Écriture de l objet sur un flux de sortie Envoie de la copie sur le réseau Conclusion: Pour passer un paramètre: on le copie Passage des arguments, même les objets, par valeur!!! Pas d effets de bord! Comparaison d objet distants Introduction Les applications distribuées Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Exemple complet: Calcul d âge Conclusion

Gestion de compte en banque à distance Première étape: l interface du serveur Contraintes: les méthodes doivent pouvoir générer une erreur réseau Objet client: l utilisateur effectue des dépôts et des retraits d argent sur un compte géré à distance Objet distant de gestion du compte : maintient le solde et effectue les opérations L interface doit hériter de Remote public interface comptedistant extends java.rmi.remote { // dépot d argent float depot(float montant) throws java.rmi.remoteexception; // retrait d argent float retrait (float montant) throws java.rmi.remoteexception; // lecture du solde float litsolde() throws java.rmi.remoteexception; Deuxième étape: implantation du serveur Compte en banque: serveur distant Implantation de l interface Spécification du code des méthodes de l interface Définition du constructeur pour l objet distant Au lancement du serveur (main de la classe principale) Contraintes: Création et installation d un gestionnaire de sécurité Création d une instance de l objet distant Enregistrement de l objet sur le serveur de nom Étendre la classe UnicastRemoteObject Traiter les erreurs d exécution public class compteserveur extends UnicastRemoteObject implements comptedistant { float solde = 0;... // constructeur public static void main(string args[]) { System.setSecurityManager(new RMISecurityManager()); try { compteserveur uncompte = new compteserveur(); Naming.rebind("gestionCompteDistant", uncompte); catch (RemoteException...)... catch (NotBoundException...)... // implantation des méthodes de l interface...

Développement de l objet client Objet client public class Client implements ActionListener { Déclaration d une référence sur un objet implantant l interface Affectation de cette référence à l objet serveur déclaré dans le référentiel d implantation Appels des méthodes distantes (comme en local) Contraintes: Un client ne peut créer un nouvel objet distant Par contre un serveur peut créér un nouvel objet et le renvoyer au client (par adresse) private comptedistant compte; public Client(){ try { compte = (comptedistant) Naming.lookup( "//site/gestioncomptedistant"); catch (Exception e) {...... compte.depot (montant); // appel de méthode... rmic Passage de paramètres Engendre les fichiers Stub.class et skel) À partir de fichiers java compilés contenant des implantations d objets distants (qui implante l interface java.rmi.remote). Permet aussi de voir les fichier.java Linux: -keepgenerated Windows:.keep Les types primitifs sont passés par valeur. Les objets non distants sont passés par valeur. Ils doivent donc être sérialisables (implanter l interface java.io.serializable). rmic hello.helloimpl (nom de package complet) hello/helloimpl Skel.class hello/helloimpl Stub.class Pour les objets distants, une référence est passée vers le skel distant (java.rmi.server.remoteref). Le code utilisateur récupère une référence vers la classe stub qui implante l interface initiale. Java 1.5: stub et skel sont inclus automatiquement dans le les serveur et le client ( stub seulement)

RMI, Mode d emploi Pour créer une application RMI, suivre les étapes suivantes: 1. Définir les spécifications du service RMI sous forme d interfaces. 2. Créer et compiler les implémentations de ces interfaces. 3. Créer les classes pour la souche et le skeleton à l aide de la commande rmic. 4. Créer et compiler une application lanceur du service RMI. 5. lancer le rmiregister et lancer l application lanceur du service RMI. 6. Créer et compiler un programme client qui accède à des objets distants : ce service RMI. Plan Introduction Les applications distribuées Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Exemple complet: Calcul d âge Conclusion 7. Lancer ce client. Classe côté client et serveur: Age package business; import java.util.gregoriancalendar; import java.util.calendar; import java.io.serializable; /* * Age implemente Serializable car devra etre retournée par RMI */ public class Age extends GregorianCalendar implements Serializable { public int getnbannees() { return this.get(calendar.year); Classe côté client et serveur: Personne package business; import java.util.gregoriancalendar; import java.util.calendar; import java.io.serializable; /* * Personne implemente Serializable car devra etre envoyé par RMI */ public class Personne implements Serializable { public String nom; private String prenom; private GregorianCalendar datenaissance; public String getnom() {return nom; public String getprenom() {return prenom; public int getanneenaissance() { return datenaissance.get(calendar.year); public Personne (String nom, String prenom, GregorianCalendar datenaissance) { this.nom = nom; this.prenom = prenom; this.datenaissance = datenaissance;

Interface côté client et serveur: CalculAgeRMI Classe côté serveur: CalculAgeRMIImpl package calcul; import business.*; import java.rmi.*; import java.util.*; import java.rmi.server.*; package calcul; import java.rmi.*; import business.*; public interface CalculAgeRMI extends Remote { public Age calcul(personne pers) throws java.rmi.remoteexception; public class CalculAgeRMIImpl extends UnicastRemoteObject implements CalculAgeRMI { public CalculAgeRMIImpl() throws java.rmi.remoteexception { public Age calcul(personne pers) throws java.rmi.remoteexception { int anneenaissance = pers.getanneenaissance(); System.out.println("annee de naissance de " + pers.getnom() + " : " + anneenaissance); // faire la soustraction entre la date courante et la date de naissance GregorianCalendar aujourdhui = new GregorianCalendar(); int anneecourante = aujourdhui.get(calendar.year); System.out.println("annee courante : " + anneecourante); int ageentier = anneecourante - anneenaissance; // on cree un calendrier et on le positionne pour fabriquer l age Age agearetouner = new Age(); agearetouner.set(ageentier + 1, 0, 0); // + 1 car la premiere annee a pour indice 0 return agearetouner; Classe côté serveur: LanceServeurRMI Classe côté client: ClientRMI import java.rmi.*; import java.net.malformedurlexception; import calcul.*; public class LanceServeurRMI { public static void main(string args[]) { try { CalculAgeRMIImpl ca = new CalculAgeRMIImpl(); System.out.println("l objet RMI est construit"); Naming.rebind("rmi://localhost/CALCUL_AGE", ca); System.out.println ("l objet RMI est inscrit au service de nommage"); catch (RemoteException exp) { System.out.println("Pb de RemoteException : " + exp); catch (MalformedURLException exp) { System.out.println("Pb de NotBoundException : " + exp); import java.rmi.*; import java.util.*; import java.net.malformedurlexception; import business.*; import calcul.*; public class ClientRMI { public static void main(string args[ ]) { ///... GregorianCalendar gc = new GregorianCalendar(1915, 6, 11); Personne tryphontournesol = new Personne("Tournesol", "Tryphon", gc); // on recupere un objet distant CalculAgeRMI et on appelle sa méthode try { CalculAgeRMI carmi = (CalculAgeRMI) Naming.lookup("rmi://" + machineserveur + "/" + "CALCUL_AGE"); Age ag = carmi.calcul(tryphontournesol); System.out.println("la personne " + tryphontournesol.getprenom() + " " + tryphontournesol.getnom() + " a pour age : " + ag.getnbannees()); catch...

Exceptions Makefile CLASSPATH=classes try { CalculAgeRMI carmi = (CalculAgeRMI) Naming.lookup("rmi://" + machineserveur + "/" + "CALCUL_AGE"); Age ag = carmi.calcul(tryphontournesol); System.out.println("la personne " + tryphontournesol.getprenom() + " " + tryphontournesol.getnom() + " a pour age : " + ag.getnbannees()); catch (RemoteException exp) { System.out.println("Pb de RemoteException : " + exp); catch (NotBoundException exp) { System.out.println("Pb de NotBoundException : " + exp); catch (MalformedURLException exp) { System.out.println("Pb de NotBoundException : " + exp);.phony: classes souches clean start_serveur start_client # souches pas necessaire en Java 1.5 all: classes classes: javac -d $(CLASSPATH) business/*.java javac -d $(CLASSPATH) calcul/*.java javac -d $(CLASSPATH) serveur/lanceserveurrmi.java javac -d $(CLASSPATH) client/clientrmi.java souches: cd $(CLASSPATH); rmic -v1.1 -keepgenerated -d. calcul.calculagermiimpl # À exécuter sur le serveur, il est nécessaire d avoir les.class des # souches (stub) start_serveur: rmiregistry & java LanceServeurRMI java ClientRMI localhost # À exécuter sur le client, remplacer localhost par l url du serveur start_client: java ClientRMI localhost clean: rm -rf $(CLASSPATH)/* rm -f */*.class Plan Parallélisme sur le serveur Introduction Les applications distribuées Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Un serveur RMI peut servir plusieurs clients Un thread séparé est créé pour chaque client sur le serveur C est au développeur du programme serveur d assurer leur bonne synchronisation Exemple complet: Calcul d âge Conclusion

Synchronized Synchronized En Java, tous les objets ont un verrou associé (mutex) objets méthodes classes... Pour réclamer un verrou: synchronized Si le verrou est disponible, on exécute le code dans le bloc Si le verrou n est pas disponible, on est mis en attente Object foo; /*... */ synchronized(foo) { /* Exécuté lorsque le verrou de foo est obtenu */ public synchronized void methode(...) { /* Exécuté lorsque le verrou sur la méthode est obtenu */ S assurer qu un seul objet à la fois exécute le code Blocages!! Truc: si une méthode synchronized alors toutes les méthodes (publiques) aussi Attention: l adjectif synchronized n est pas hérité Inter-blocage public synchronized void methode1(...) { obj.methode2(...); public synchronized void methode2(...) { obj.methode1(...); Très difficile à programmer/débugger Quoi mettre en synchronized? Synchronisation = ralentissements (+ bugs=blocages) Pas de synchronisation = programme faux Programmation du serveur public class compteserveur extends UnicastRemoteObject implements comptedistant { float solde = 0;... // constructeur public static void main(string args[]) {... // Creation et Enregistrement aupres du serveur de nom // dépot d argent public synchronized float depot(float montant) throws java.rmi.remoteexception {... // retrait d argent public synchronized float retrait (float montant) throws java.rmi.remoteexception {... // lecture du solde public synchronized float litsolde() throws java.rmi.remoteexception {...

Aspects non abordés Téléchargement de souches et des classes nécessaires (typiquement Age et Personne) via un site web (pas seulement pour les applets) Sécurité via le serveur de noms notamment Liens avec Corba via un changement de protocole (les Stub et skel héritent d autres classes)