Calcul Parallèle. Cours 5 - JAVA RMI

Documents pareils
Remote Method Invocation Les classes implémentant Serializable

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

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

Remote Method Invocation (RMI)

Remote Method Invocation en Java (RMI)

RMI le langage Java XII-1 JMF

Conception de serveurs d'applications ouverts

Intergiciel - concepts de base

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Auto-évaluation Programmation en Java

Programmation répartie RPC & RMI

Java - RMI Remote Method Invocation. Java - RMI

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

TP1 : Initiation à Java et Eclipse

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

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

Synchro et Threads Java TM

Développement Logiciel

Premiers Pas en Programmation Objet : les Classes et les Objets

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

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

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

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

INITIATION AU LANGAGE JAVA

Un ordonnanceur stupide

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Objets et Programmation. origine des langages orientés-objet

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Programmer en JAVA. par Tama

Java 1.5 : principales nouveautés

Threads. Threads. USTL routier 1

Programmation Par Objets

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

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

Introduction : les processus. Introduction : les threads. Plan

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

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

2 Chapitre 1 Introduction

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

Applet pour visualiser les variables «automate» notifiées

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

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Une introduction à Java

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

JAVA. Introduction à la programmation objet avec java 1/4. Nadir BOUSSOUKAIA

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Corrigés des premiers exercices sur les classes

Corrigé des exercices sur les références

Package Java.util Classe générique

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

Java Licence Professionnelle CISII,

Initiation à JAVA et à la programmation objet.

Projet gestion d'objets dupliqués

TP1 : Initiation à Java et Eclipse

PROGRAMMATION PAR OBJETS

Chapitre I Notions de base et outils de travail

Cours 1: Java et les objets

Introduction à CORBA

La JVM. La machine virtuelle Java. La JVM. La JVM

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

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

Java Naming and Directory Interface

Langage Java. Classe de première SI

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

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

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Traitement de données

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

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

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

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

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

ACTIVITÉ DE PROGRAMMATION

Environnements de développement (intégrés)

Derrière toi Une machine virtuelle!

TP1. Outils Java Eléments de correction

Architecture Orientée Service, JSON et API REST

Bases Java - Eclipse / Netbeans

OS Réseaux et Programmation Système - C5

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Présentation de Java. Olivier de Pertat IT GROUP

Projet de programmation (IK3) : TP n 1 Correction

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Utiliser Java sans BlueJ

Introduction à la Programmation Parallèle: MPI

as Architecture des Systèmes d Information

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

Langage à objets : JAVA (1)

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

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

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

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Desktop Intégration. Rémi Forax

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmation Objet Java Correction

Transcription:

Calcul Parallèle Cours 5 - JAVA RMI Eric Goubault Commissariat à l Energie Atomique & Chaire Ecole Polytechnique/Thalès Saclay Le 28 février 2012 Eric Goubault 1 28 février 2012

Remote Method Invocation Permet d invoquer des méthodes d un objet distant, c est à dire appartenant à une autre JVM, sur une autre machine Architecture de type client/serveur; similaire aux Remote Procedure Calls POSIX Se rapproche de plus en plus de CORBA (langage indépendant etc., voir cours suivant) Références: JAVA, Network Programming and Distributed Computing, D. Reilly et M. Reilly, Addison-Wesley. et http://java.sun.com/products/jdk/rmi/ Eric Goubault 2 28 février 2012

Architecture Classe qui implémente la méthode distante (serveur): - dont les méthodes renvoient ou recoivent des objets Serializable (sémantique par copie) - ou des objets appartenant à des classes remote (sémantique par référence) - méthodes doivent pouvoir lancer l exception RemoteException Client qui utilise les méthodes distantes Registre d objets distants qui associe aux noms d objets l adresse des machines qui les contiennent Eric Goubault 3 28 février 2012

Les classes implémentant Serializable Objets instances peuvent être transcrits en stream, c est-à-dire en flots d octets. writeobject(objectoutputstream aoutputstream) readobject(objectinputstream ainputstream) responsables respectivement de décrire un objet sous forme de flot d octets et de reconstituer l état d un objet à partir d un flot d octets. La plupart des classes (et de leurs sous-classes) de base String, HashTable, Vector, HashSet, ArrayList...sont Serializable. Eric Goubault 4 28 février 2012

Serializable dans le cas où on passe une classe Serializable, il faut que la définition de cette classe soit connue ( copiée sur les différentes machines) des clients et du serveur il peut y avoir à gérer la politique de sécurité (sauf pour les objets simples, comme String etc.). Eric Goubault 5 28 février 2012

Les classes remote leurs instances sont des objets ordinaires dans l espace d adressage de leur JVM des pointeurs sur ces objets peuvent être envoyés aux autres espaces d adressage Eric Goubault 6 28 février 2012

Pour en savoir plus: packages RMI java.rmi définit l interface RemoteInterface, et les exceptions, java.rmi.activation (depuis JAVA2): permet l activation à distance des objets, java.rmi.dgc: s occupe du ramassage de miettes dans un environnement distribué, java.rmi.registry fournit l interface permettant de représenter un rmiregistry, d en créer un, ou d en trouver un, java.rmi.server fournit les classes et interfaces pour les serveurs RMI. http://java.sun.com/javase/6/docs/technotes/ guides/rmi/index.html Eric Goubault 7 28 février 2012

Les différentes classes et interfaces implémente Remote RemoteObject IOException RemoteServer hérite RemoteException hérite Activatable UnicastRemoteObject Eric Goubault 8 28 février 2012

Exemple - on retourne un Serializable Hello World distribué: on va construire les classes: Machine Serveur HelloInterface implemente cree HelloServer Hello (Remote) (générés par rmic) rmiregistry cherche HelloClient Machine Client Hello_Skel Hello_Stub Eric Goubault 9 28 février 2012

Stubs (coté client) Un stub est une sorte de proxy pour le client (cache la sérialization et les communications bas niveau sur le réseau): c est lui qui initie la connection avec la JVM distante contenant l objet distant envoie les arguments à l objet distant ( marshals ) attend les résultats récupère les résultats ( unmarshals ) Eric Goubault 10 28 février 2012

Squelettes (coté serveur) Un squelette est responsable (sur la demande du stub correspondant) d appeler la méthode sur le serveur: lit les paramètres ( unmarshals ) appelle la méthode de l objet serveur correspondant écrit les paramètres sur le réseau ( marshals ) Eric Goubault 11 28 février 2012

Interface de l objet distant import java.rmi.*; public interface HelloInterface extends Remote { public String say() throws RemoteException; } Eric Goubault 12 28 février 2012

Hello World: implémentation de l objet distant import java.rmi.*; import java.rmi.server.*; public class Hello extends UnicastRemoteObject implements HelloInterface { private String message; public Hello(String msg) throws RemoteException { message = msg; } Eric Goubault 13 28 février 2012

Hello World: implémentation de l objet distant } public String say() throws RemoteException { return message; } Eric Goubault 14 28 février 2012

Compilation javac HelloInterface.java javac Hello.java (crée HelloInterface.class et Hello.class) Eric Goubault 15 28 février 2012

Client import java.rmi.*; public class HelloClient { public static void main(string[] argv) { try { HelloInterface hello = (HelloInterface) Naming.lookup ("//cher.polytechnique.fr/service"); System.out.println(hello.say()); (le serveur est supposé toujours être sur cher, voir plus loin pour d autres méthodes) Eric Goubault 16 28 février 2012

Client } } } catch(exception e) { System.out.println("HelloClient exception: "+e); } Eric Goubault 17 28 février 2012

Serveur import java.rmi.*; public class HelloServer { public static void main(string[] argv) { try { Naming.rebind("Service",new Hello("Hello, world!")); System.out.println("Hello Server is ready."); Eric Goubault 18 28 février 2012

Serveur } } } catch(exception e) { System.out.println("Hello Server failed: "+e); } Eric Goubault 19 28 février 2012

Compilation et démarrage du serveur javac HelloClient.java javac HelloServer.java Démarrer le serveur de noms: rmiregistry & (attendre un minimum) Eric Goubault 20 28 février 2012

Compilation et démarrage du serveur Démarrer le serveur (Hello): java HelloServer & (attendre un peu) Eric Goubault 21 28 février 2012

Démarrage des clients et exécution (ici en local) > Hello Server is ready. > java HelloClient Hello, world! Eric Goubault 22 28 février 2012

Installation locale aux salles de TD rmiregistry doit être démarré avec un numéro de port distinct pour plusieurs utilisateurs sur une même machine (numéros à partir de 1099), voir répartition sur fiche TD. Exemple sur machine serveur: rmiregistry 1100 & Dans ce cas, le serveur devra s enregistrer par Naming.rebind("rmi://localhost:1100/Service"); Et le client devra chercher sur le même port: Naming.lookup("rmi://cher.polytechnique.fr:1100/Service") Eric Goubault 23 28 février 2012

Execution en salle TD (récupérer les programmes java sur la page web) Exemple: serveur sur cher, [goubaul1@cher HelloNormal]$ java HelloServer Hello Server is ready. Client sur loire, [goubaul1@loire HelloNormal]$ java HelloClient Hello, world! Eric Goubault 24 28 février 2012

Autre méthode pour le serveur import java.rmi.*; import java.rmi.registry.*; public class HelloServer { public static void main(string[] argv) { try { LocateRegistry.createRegistry(1100); Registry r = LocateRegistry.getRegistry ("oncidium",1100); Naming.rebind("//oncidium:1100/Service",new Hello("Hi!")) String[] name = r.list(); for (int i=0; i<name.length;i++) System.out.println(name[i]); System.out.println("Hello Server is ready."); } catch(exception e) { System.out.println("Hello Server failed: "+e); } } } Eric Goubault 25 28 février 2012

Explications LocateRegistry.createRegistry(port number) crée le démon rmiregistry écoutant sur le port port number LocateRegistry.getRegistry(server name, port number) essaie de trouver un démon rmiregistry sur la machine server name et sur le port port number Cela donne un objet manipulable... par exemple, on parcourt la liste des services connus du rmiregistry par la boucle sur r.list() Eric Goubault 26 28 février 2012

Ou encore... (accès au rmiregistry) import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.unicastremoteobject; public class HelloServer { public static void main(string[] argv) { try { LocateRegistry.createRegistry(1100); Registry r = LocateRegistry.getRegistry ("localhost",1100); Hello obj = new Hello("Hello, world!"); r.bind("service", obj); System.out.println("Hello Server is ready."); } catch(exception e) { System.out.println("Hello Server failed: "+e); } } } Eric Goubault 27 28 février 2012

Ou encore... (accès direct au stub crée dynamiquement) (...) public class HelloServer { public static void main(string[] argv) { try { LocateRegistry.createRegistry(1100); Registry r = LocateRegistry.getRegistry ("localhost",1100); Hello obj = new Hello("Hello, world!"); HelloInterface stub=(hellointerface)unicastremoteobject. exportobject(obj,1100); r.bind("service", stub); System.out.println("Hello Server is ready."); } catch(exception e) { System.out.println("Failed: "+e); } } Eric Goubault 28 28 février 2012

Avec... import java.rmi.*; import java.rmi.server.*; public class Hello implements HelloInterface, Remote { private String message; public Hello(String msg) throws RemoteException { message = msg; } public String say() throws RemoteException { return message; } } Eric Goubault 29 28 février 2012

Et pour le client: (accès au rmiregistry) import java.rmi.*; import java.rmi.registry.registry; import java.rmi.registry.locateregistry; public class HelloClient { public static void main(string[] argv) { try { Registry registry = LocateRegistry.getRegistry ("oncidium",1100); HelloInterface hello = (HelloInterface) registry.lookup("service"); System.out.println(hello.say()); } catch(exception e) { System.out.println("HelloClient exception: "+e); } } } Eric Goubault 30 28 février 2012

Callback L idée est la suivante (programmation événementielle, typique d interfaces graphique par exemple AWT): les clients vont s enregistrer auprès d un serveur, le serveur va les rappeler uniquement lorsque certains événements se produisent, le client n a pas ainsi à faire de l active polling (c est à dire à demander des nouvelles continuellement au serveur) pour être mis au fait des événements. Eric Goubault 31 28 février 2012

Principe du rappel Comment notifier un objet (distant) de l apparition d un événement? on passe la référence de l objet à rappeler, au serveur chargé de suivre (ou source des) les événements, à l apparition de l événement, le serveur va invoquer la méthode de notification du client. Ainsi, pour chaque type d événement, on crée une interface spécifique (pour le client qui veut en être notifié), les clients potentiels à notifier doivent s enregistrer auprès d une implémentation de cette interface. Cela implique que clients et serveurs sont tous à leur tour serveurs et clients. Eric Goubault 32 28 février 2012

C est à dire... Client1 envoie notification Client1 Client2 Serveur puis Serveur Client2 Client3 s enregistrent Client1 Client2 Client3 Client3 (liste interne au serveur) Eric Goubault 33 28 février 2012

Exemple - interface associée à un évévenement... ici, changement de température: interface TemperatureListener extends java.rmi.remote { public void temperaturechanged(double temperature) throws java.rmi.remoteexception; } C est la méthode de notification de tout client intéressé par cet événement. Forcément un objet Remote. Eric Goubault 34 28 février 2012

Exemple - l interface du serveur d événements... doit au moins pouvoir permettre l inscription et la désinscription de clients voulant être notifié: interface TemperatureSensor extends java.rmi.remote { public double gettemperature() throws java.rmi.remoteexception; public void addtemperaturelistener (TemperatureListener listener) throws java.rmi.remoteexception; public void removetemperaturelistener (TemperatureListener listener) throws java.rmi.remoteexception; } Eric Goubault 35 28 février 2012

Exemple - l implémentation du serveur doit être une sous-classe de UnicastRemoteObject (pour être un serveur...). doit implémenter l interface TemperatureListener pour pouvoir rappeler les clients en attente, implémente également Runnable ici pour pouvoir avoir un thread indépendant qui simule les changements de température. Eric Goubault 36 28 février 2012

Exemple - implémentation serveur import java.util.*; import java.rmi.*; import java.rmi.server.*; public class TemperatureSensorServer extends UnicastRemoteObject implements TemperatureSensor, Runnable { private volatile double temp; private Vector <TemperatureListener> list = new Vector <TemperatureListener> (); static final long serialversionuid = 42L; (le vecteur list contiendra la liste des clients) Eric Goubault 37 28 février 2012

Exemple - implémentation serveur Constructeur (température initiale) et méthode de récupération de la température: public TemperatureSensorServer() throws java.rmi.remoteexception { temp = 98.0; } public double gettemperature() throws java.rmi.remoteexception { return temp; } Eric Goubault 38 28 février 2012

Exemple - implémentation serveur Méthodes d ajout et de retrait de clients: public void addtemperaturelistener (TemperatureListener listener) throws java.rmi.remoteexception { System.out.println("adding listener -"+listener); list.add(listener); } public void removetemperaturelistener (TemperatureListener listener) throws java.rmi.remoteexception { System.out.println("removing listener -"+listener); list.remove(listener); } Eric Goubault 39 28 février 2012

Exemple - implémentation serveur Thread responsable du changement aléatoire de la température: public void run() { Random r = new Random(); for (;;) { try { int duration = r.nextint() % 10000 +2000; if (duration < 0) duration = duration*(-1); Thread.sleep(duration); } Eric Goubault 40 28 février 2012

Exemple - implémentation serveur catch(interruptedexception ie) {} int num = r.nextint(); if (num < 0) temp +=.5; else temp -=.5; notifylisteners(); } } (notifylisteners() est la méthode suivante, chargée de broadcaster le changement d événements à tous les clients enregistrés) Eric Goubault 41 28 février 2012

Exemple - implémentation du serveur private void notifylisteners() { for (Enumeration e = list.elements(); e.hasmoreelements();) { TemperatureListener listener = (TemperatureListener) e.nextelement(); try { listener.temperaturechanged(temp); } catch(remoteexception re) { System.out.println("removing listener -"+listener); list.remove(listener); } } } (on fait simplement appel, pour chaque client, à la méthode de notification temperaturechanged) Eric Goubault 42 28 février 2012

Exemple - implémentation du serveur Enregistrement du service auprès du rmiregistry (éventuellement fourni à la ligne de commande): public static void main(string args[]) { System.out.println("Loading temperature service"); try { TemperatureSensorServer sensor = new TemperatureSensorServer(); String registry = "localhost"; if (args.length >= 1) registry = args[0]; String registration = "rmi://"+registry+ "/TemperatureSensor"; Naming.rebind(registration,sensor); Eric Goubault 43 28 février 2012

Exemple Démarrage du thread en charge de changer aléatoirement la température, et gestion des exceptions: Thread thread = new Thread(sensor); thread.start(); } catch (RemoteException re) { System.err.println("Remote Error - "+re); } catch (Exception e) { System.err.println("Error - "+e); } } } Eric Goubault 44 28 février 2012

Exemple - implémentation clients import java.rmi.*; import java.rmi.server.*; public class TemperatureMonitor extends UnicastRemoteObject implements TemperatureListener { public TemperatureMonitor() throws RemoteException {} (étend UnicastRemoteObject car serveur également! De même implémente TemperatureListener) Rq: constructeur vide (celui d Object en fait). Eric Goubault 45 28 février 2012

Exemple - implémentation clients Recherche du service serveur d événements: public static void main(string args[]) { System.out.println("Looking for temperature sensor"); try { String registry = "localhost"; if (args.length >= 1) registry = args[0]; String registration = "rmi://"+registry+ "/TemperatureSensor"; Remote remoteservice = Naming.lookup(registration); TemperatureSensor sensor = (TemperatureSensor) remoteservice; Eric Goubault 46 28 février 2012

Exemple - implémentation clients Création d un moniteur et enregistrement auprès du serveur d événements: double reading = sensor.gettemperature(); System.out.println("Original temp : "+reading); TemperatureMonitor monitor = new TemperatureMonitor(); sensor.addtemperaturelistener(monitor); Eric Goubault 47 28 février 2012

Exemple - implémentation clients Gestion des exceptions: } catch(notboundexception nbe) { System.out.println("No sensors available"); } catch (RemoteException re) { System.out.println("RMI Error - "+re); } catch (Exception e) { System.out.println("Error - "+e); } } Eric Goubault 48 28 février 2012

Exemple - implémentation clients Implémentation de la méthode de rappel: public void temperaturechanged(double temperature) throws java.rmi.remoteexception { System.out.println("Temperature change event : " +temperature); } Eric Goubault 49 28 février 2012

Compilation [goubaul1@cher Ex3]$ javac *.java Eric Goubault 50 28 février 2012

Exécution [goubaul1@cher Ex3]$ rmiregistry & [goubaul1@cher Ex3]$ java TemperatureSensorServer Loading temperature service Premier client (sur loire): [goubaul1@loire Ex3]$ rmiregistry & [goubaul1@loire Ex3]$ java TemperatureMonitor cher Looking for temperature sensor Original temp : 100.0 Temperature change event : 99.5 Temperature change event : 100.0 Temperature change event : 100.5 Eric Goubault 51 28 février 2012

Exécution Temperature change event : 100.0 Temperature change event : 100.5 Temperature change event : 101.0 Temperature change event : 100.5 Temperature change event : 100.0 Temperature change event : 100.5 Temperature change event : 101.0 Temperature change event : 101.5 Eric Goubault 52 28 février 2012

Exécution On voit alors sur la console de cher: adding listener -TemperatureMonitor_Stub[RemoteStub [ref: [endpoint:[129.104.254.64:3224](remote), objid:[6e1408:f29e197d47:-8000, 0]]]] Rajoutons un moniteur sur doubs: [goubaul1@doubs Ex3]$ rmiregistry & [goubaul1@doubs Ex3]$ java TemperatureMonitor cher Looking for temperature sensor Original temp : 101.5 Temperature change event : 102.0 Eric Goubault 53 28 février 2012

Exécution Temperature change event : 102.5 Temperature change event : 103.0 Temperature change event : 102.5 Temperature change event : 103.0 Temperature change event : 103.5 Temperature change event : 102.5 Temperature change event : 102.0 Eric Goubault 54 28 février 2012

Ce qui produit sur cher: Exécution adding listener -TemperatureMonitor_Stub[RemoteStub [ref: [endpoint:[129.104.254.57:3648](remote), objid:[6e1408:f29de7882e:-8000, 0]]]] On voit bien que les températures et événements sont synchronisés avec l autre client sur loire: Temperature change event : 102.0 Eric Goubault 55 28 février 2012

Exécution Temperature change event : 102.5 Temperature change event : 103.0 Temperature change event : 102.5 Temperature change event : 103.0 Temperature change event : 103.5 ^C [goubaul1@loire Ex3]$ Eric Goubault 56 28 février 2012

Exécution On a interrompu sur loire, du coup sur cher: removing listener -TemperatureMonitor_Stub[RemoteStub [ref: [endpoint:[129.104.254.64:3224](remote), objid:[6e1408:f29e197d47:-8000, 0]]]] On interrompt par Control-C sur doubs, du coup sur cher: removing listener -TemperatureMonitor_Stub[RemoteStub [ref: [endpoint:[129.104.254.57:3648](remote), objid:[6e1408:f29de7882e:-8000, 0]]]] Eric Goubault 57 28 février 2012