Intergiciel - concepts de base



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

Remote Method Invocation (RMI)

RMI le langage Java XII-1 JMF

Remote Method Invocation en Java (RMI)

Remote Method Invocation Les classes implémentant Serializable

Calcul Parallèle. Cours 5 - JAVA RMI

Conception de serveurs d'applications ouverts

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

Java - RMI Remote Method Invocation. Java - RMI

CORBA. (Common Request Broker Architecture)

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

Programmation répartie RPC & RMI

NFP111 Systèmes et Applications Réparties

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

CORBA haute performance

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

2 Chapitre 1 Introduction

OS Réseaux et Programmation Système - C5

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

Patrons de Conception (Design Patterns)

Le modèle client-serveur

Introduction aux intergiciels

Software Engineering and Middleware A Roadmap

TP1 : Initiation à Java et Eclipse

TP1. Outils Java Eléments de correction

Plan du cours. Autres modèles pour les applications réparties Introduction. Mode de travail. Introduction

Architecture Orientée Service, JSON et API REST

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

.NET remoting. Plan. Principes de.net Remoting

Prise en compte des ressources dans les composants logiciels parallèles

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

XML, PMML, SOAP. Rapport. EPITA SCIA Promo janvier Julien Lemoine Alexandre Thibault Nicolas Wiest-Million

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Annexe : La Programmation Informatique

Description de la formation

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

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

Architectures n-tiers Intergiciels à objets et services web

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Cours 1: Java et les objets

Initiation à JAVA et à la programmation objet.

Chapitre 2. Classes et objets

Chapitre I Notions de base et outils de travail

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

Java Naming and Directory Interface

Urbanisation des SI. Des composants technologiques disponibles. Urbanisation des Systèmes d'information Henry Boccon Gibod 1

Messagerie asynchrone et Services Web

Introduction aux applications réparties

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

Evaluation Idéopass Cahier d analyse technique

GEI 465 : Systèmes répartis

25 septembre Migration des accès au Registre national en protocole X.25 vers le protocole TCP/IP, pour les utilisateurs du Registre national

18 TCP Les protocoles de domaines d applications

Projet gestion d'objets dupliqués

Architecture distribuée

Premiers Pas en Programmation Objet : les Classes et les Objets

Bien architecturer une application REST

Le service FTP. M.BOUABID, Page 1 sur 5

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

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

Auto-évaluation Programmation en Java

Java DataBaseConnectivity

NSY102. Conception de logiciels Intranet Introduction

Java pour le Web. Cours Java - F. Michel

Intérêt du NAT (Network Address Translation) Administration Réseau Niveau routage. Exemple d Intranet. Principe NAT

Intégration d'applications à "gros grain" Unité d'intégration : le "service" (interface + contrat)

Systèmes d'informations historique et mutations

Les Architectures Orientées Services (SOA)

Cours CCNA 1. Exercices

Services OSI. if G.Beuchot. Services Application Services Présentation - Session Services Transport - Réseaux - Liaison de Données - Physique

TP2 - Conguration réseau et commandes utiles. 1 Généralités. 2 Conguration de la machine. 2.1 Commande hostname

Urbanisation des Systèmes d'information

TP1 : Initiation à Java et Eclipse

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

LES ACCES ODBC AVEC LE SYSTEME SAS

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

Les Services Web. Jean-Pierre BORG EFORT

Cisco Certified Network Associate

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

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

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

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Capture, Filtrage et Analyse de trames ETHERNET avec le logiciel Wireshark. Etape 1 : Lancement des machines virtuelles VMWARE et de Wireshark

Conception des systèmes répartis

Projet de Veille Technologique

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Mise en œuvre des serveurs d application

Table des matières Chapitre 1 Virtualisation, enjeux et concepts Chapitre 2 Ligne de produit XEN

Introduction à la plateforme J2EE

WEA Un Gérant d'objets Persistants pour des environnements distribués

L annuaire et le Service DNS

Le cadre des Web Services Partie 1 : Introduction

Le Network File System de Sun (NFS)

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

Introduction aux «Services Web»

Introduction aux Technologies de l Internet

L3 informatique Réseaux : Configuration d une interface réseau

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

Transcription:

Intergiciel - concepts de base Ada Diaconescu, Laurent Pautet & Bertrand Dupouy ada.diaconescu _at_ telecom-paristech.fr

Rappel : système réparti Système constitué de multiples ressources informatiques (ex : processus logiciels, équipements matériels, ) interconnectées via un support de communication (ex: réseaux, communication interprocessus, mémoire partagée, ) 2

Rappel : modèle OSI et TCP/IP OSI TCP-IP TCP-IP Application Présentation Application Application Session Transport TCP / UDP Sockets Sockets TCP / UDP Réseau IP IP Liaison Ethernet Ethernet Physique Ethernet Ethernet 3

Des sockets aux intergiciels Limites de l API socket - Travail fastidieux, répétitif, sujet aux erreurs - Configuration, construction de requêtes, déploiement, exécution, Solution : - Factoriser les opérations sur les sockets à l aide de bibliothèques de plus haut niveau Intergiciel («middleware») : abstractions pour la répartition - Fournit un modèle de répartition : entités inter-agissantes suivant une sémantique claire - Au dessus des briques de base de l OS (dont les sockets) - Définit un cadre complet pour la conception et la construction d applications distribuées 4

Intergiciels - définitions de base Logiciel réutilisable qui fait la médiation entre les applications et le réseau Gère et facilite l implantation de l interaction entre des applications qui s exécutent sur des plates-formes distantes et/ou hétérogènes 5

Intergiciel positionnement (1) Au dessus du réseau En dessous des applications (logique de business), bases de données, Sur toutes les machines participantes 6

Intergiciel positionnement (2) L intergiciel - où se trouve-t-il par rapport au modèle OSI? Application Transport Réseau Liaison Physique Services Application Services Intergiciel Services Réseau Réseau Application Transport Réseau Liaison Physique 7

Intergiciel - contenu Une collection réutilisable et extensible de services non-fonctionnels : A l origine : des services de communication Et ensuite : nommage, transactions, sécurité, persistance, gestion d instances, journalisation (logging), Un service non-fonctionnel n est pas conscient des buts fonctionnels (de business) et de la sémantique de l application qu ils servent 8

Intergiciels importance Aide à définir et concevoir un système réparti Aide les développeurs, en les protégeant : - des détails liées à la plateforme sous-jacente - des difficultés liées à la distribution => Plus besoin de programmer de sockets Amortit les coûts de développement initiaux par la réutilisation et par la dissémination de l expertise : - Communication : création de session, (de)marshalling, collecte et «bufferisation» de requêtes, contrôle de la concurrence, - D autres services non-fonctionnels : nommage, transactions, sécurité, 9

Intergiciels caractéristiques Se fonde sur des mécanismes de répartition - Passage de messages, sous-programmes distant - Objets répartis, objets partagés (mémoire répartie) - Transactions Fournit un contrôle sur ces mécanismes - Langages de description ou de programmation - Interfaces de bibliothèques ou de services S accompagne d un intergiciel de mise en œuvre - Bibliothèques + outils 10

modèle de répartition Envoi de Messages Interface réseau - Interface bas niveau - UDP, TCP, ATM - IPv6, multicast, SSL/TSL PVM/MPI - Calcul massivement parallèle - Communication de groupe Java Messaging Service (JMS) - Interface haut niveau (Standard Java) - Message Oriented Middleware (MOM) : Point à Point ou Publish / Subscribe 11

Modèle de répartition Appel de Procédure à Distance RPC (Remote Procedure Call) - Sun Service de nommage ou de localisation (portmapper) Compilateur rpcgen qui produit les souches et squelettes Intégré dans DCE (Distributed Computing Environment) DSA (annexe des systèmes répartis d Ada95) Réduit la frontière entre réparti et monolithique (local et uni-thread) Services de nommage et de localisation internes Annulation d appel de sous-programmes distants Référence sur des sous-programmes distants SOAP (Simple Object Access Protocol) Protocole léger de communication d informations structurées Le plus souvent : RPC à base de HTTP + XML (protocole uniquement) 12

modèle RPC pour les Objets répartis Appel de Méthode à Distance Approches dépendantes du langage de programmation Modula-3 : extension au langage Modula-2 RMI («Remote Method Invocation») : extension de Java DSA (annexe systèmes répartis d Ada95) : extension au langage Ada95 Approches indépendantes du langage de programmation CORBA (OMG IDL - langage de définition d interface) DCOM,.NET (Microsoft IDL) 13

Motivations Distribution (Analogie) L Evolution des Paradigmes de Programmation L Evolution des Paradigmes de Répartition Programmation avec GOTOs Passage de Message Programmation Procédurale Programmation par Appel de Procédure à Distance Programmation Orientée Objet Programmation par Appel de Méthode à Distance 14

Motivations - Hétérogénéité Appel de méthodes à distance sur objets répartis hétérogènes, indépendamment des : - Langages de programmation - Systèmes d exploitation - Plates-formes d exécution - Fournisseurs de technologie - Protocoles réseau - Formats des données Consensus pour l interopérabilité. Mais, de nombreux intergiciels restent spécifiques à - un langage, un vendeur, ou un Système d Exploitation (SE) 15

Java RMI - Remote Method Invocation Ressources : http://docs.oracle.com/javase/tutorial/rmi/index.html http://docs.oracle.com/javase/6/docs/technotes/guides/rmi A. Diaconescu, L. Pautet & B. Dupouy 16

Objectifs de Java RMI Définir une architecture distribuée qui s'intègre dans le langage Java de façon transparente, donc qui permette : L'invocation de méthodes sur des objets situés sur des machines virtuelles différentes, de façon similaire à une invocation locale ; L'utilisation de l'environnement de sécurité Java classique lors de l'exécution d'applications distribuées ; L'affranchissement du programmeur de la gestion de la mémoire, en définissant une extension distribuée au garbage collector. 17

Architecture RMI - Interface Séparation de deux concepts : Définition d un comportement Java Interface Implantation d un comportement Java Class Dans un système réparti : Le client s intéresse à la description d un service Interface Le serveur fournit l implantation - Class Système RMI Programme Client Interface Programme Serveur Implantation 18

Architecture RMI plusieurs couches Souches (stubs) et Squelettes (skeletons) Juste en dessous du programme développeur Transforment les appels Java en messages réseau Couche de Transport Fait la connexion entre les JVMs Utilise le protocole TCP/IP 19

Architecture RMI détails & exemple Stub (Souche) Fait la transition entre l appel de l Objet Client et le Réseau Skeleton (Squelette) Fait la transition entre le Réseau et l appel vers l Objet Serveur > Visibles ou invisibles par le développeur, selon la version de JDK Interface 20 = methode1() methode2()

Objet réparti via RMI - stubs et skeletons Extension du mécanisme d appels de méthodes à la répartition : Souche («stub») - Objet «Proxy» qui : - Reprend la même signature que l Objet Serveur - Est manipulé par le client Squelette («skel») - code côté serveur pour : - Traiter la requête, et - Transmettre la réponse à l Objet Client RMI + JVM ajoutent la logique de traitement de la requête: - Localisation de l objet, construction de la requête, transmission, 21

Objet réparti via RMI - terminologie & définitions Un objet distant (Remote Object) est un objet dont les méthodes peuvent être invoquées par des clients situés sur des JVM différentes ; Cet objet distant est manipulé au travers d interfaces (Remote Interfaces) qui listent les méthodes que les clients pourront invoquer sur ces objets distants ; Une référence distante (Remote Reference) est une référence qui permet d'adresser un objet situé sur une JVM différente ; Une invocation de méthode distante (Remote Method Invocation) appelle une méthode définie dans une interface d'objet distant. Elle a la même syntaxe qu'une invocation de méthode locale. 22

Passage d appels distants Objets s exécutant sur : La même JVM appel local Des JVMs différentes sur la même machine appel distant Passant par la couche réseau de la machine Des machines différentes appel distant Passant par une connexion réseau entre les machines 23

Différences entre un appel local ou distant Les clients manipulent des Proxies qui implémentent les Remote interfaces - pas directement les objets qui implémentent ces interfaces ; Les paramètres de type simple (int, ) sont passés par copie ; Les paramètres de type référence (Objet) sont sérialisés (Serializable) et passés par copie => différence des paramètres locaux dont les références sont passés par copie ; Les objets distants sont passés par référence : les méthodes sont bien exécutées sur l'objet lui-même, quelle que soit la machine virtuelle dans laquelle il réside ; Les méthodes distantes provoquent des exceptions supplémentaires : les clients doivent traiter des exceptions liées au caractère distribué des méthodes qu'ils invoquent ; Le bytecode n'est transmis à la JVM qu'au moment de son utilisation. 24

Comment trouver les objets? RMI Registry Les clients utilisent un service de nommage basique RMI Registry (rmiregistry), afin de trouver les références des objets distants Au moins un RMI Registry doit se trouver sur chaque machine où se trouvent des objets distants ; (le port d écoute peut être configuré) Les objets distants doivent être enregistrés avec le RMI Registry local afin de pouvoir être trouvés et appelés ; Les clients doivent connaître l adresse (machine et port) du RMI Registry où sont enregistrés les objets distants qu ils souhaitent appeler Note : les Services de Nommage (SN) plus avancés n imposent plus cette contrainte de localisation une seule instance du SN (à une adresse bien connue) peut être partagée par tous les clients du système réparti. 25

Appel distant Etapes de connexion entre un client et un serveur 26

Fonctions RMI RMI assure les fonctions de : Localisation des objets distants Le serveur enregistre les objets qu'il exporte auprès de rmiregistry en utilisant bind() Le client trouve des références sur ces objets exportés et récupère les stubs correspondants en donnant leurs noms lors des appels à lookup() Communication transparente grâce au protocole RMI Téléchargement dynamique de bytecode à partir d un URL donné (ex : utilisation de serveurs http, ftp, ). 27

Compilation Java vs Java + RMI Le cas réparti nécessite la génération d éléments de code supplémentaires : codage/décodage des requêtes, gestion des tables de nommages, correspondance requêtes/code utilisateur La chaîne de compilation est étendue pour générer le code supplémentaire, qui va scruter le bytecode Java, et rechercher les éléments utiles (implantant les interfaces remote, serializable, ) *.java javac *.class rmic *_Stub.class *_Skel.class Bytecode Java Application répartie prête à être déployée 28

rmic optionnel pour les versions récentes de Java Une fois que l'on a écrit est compilé une classe qui implémente les interfaces distantes, on crée le stub et le squelette correspondants grâce à rmic : Ces deux classes sont rangées dans des fichiers dont les noms sont créés par ajout de _Stub au nom de la classe pour la souche («stub»), et _Skel pour le squelette («skeleton») Notes L'option -keepgenerated -conserve les sources du stub Object contient une méthode getclass() qui donne la classe de tout objet : en ajoutant les suffixes adéquats, on obtient les noms du stub et du squelette 29

Java RMI - 1 er exemple Hello World A. Diaconescu, L. Pautet & B. Dupouy 30

Exemple de base Soient les fichiers : Hello.java, HelloServer.java du côté serveur, et HelloClient.java du côté client. Contenu de Hello.java : l'interface (ce que «voit» le client): public interface Hello extends java.rmi.remote { } String readmessage() throws java.rmi.remoteexception; Remote signifie que les méthodes de cet objet Hello doivent être appelables depuis une JVM autre que la JVM locale. HelloServeur.java implémente cette interface : public class HelloServer implements Hello { } 31

Exemple : canevas du serveur //e.g. dans une méthode main : // Donner un nom au service distant static final String HELLO_SERVICE_NAME = "HelloService"; // Creation de l'objet qui va être invoque par les clients HelloServer myserver = new HelloServer(); // export de l instance myserver (sur un port anonyme - 0) // obtenir le stub de l objet distant Hello stub = (Hello)UnicastRemoteObject.exportObject(myServer, 0); // Obtenir une référence vers le remiregistry local //(args[0] donne le port sur lequel écoute le rmiregistry) int rmiport = new Integer(args[0]).intValue(); Registry registry = LocateRegistry.getRegistry(rmiPort); // Enregistrer le service auprès de rmiregistry registry.rebind(hello_server_name, stub); Le port sur lequel écoute le RMI Registry 32 Le nom de l objet serveur

Visualiser le stub Après la compilation du serveur il faut faire : rmic HelloServer, pour avoir : le stub - HelloServer_Stub.class - destiné aux clients, et seulement pour les anciennes versions de Java : le squelette - HelloServer_Skel.class Utiliser l option -keepgenerated pour obtenir le code source du stub : rmic -keepgenerated HelloServer 33 Intergiciel / RMI

Exemple de base : canevas du client Voici comment invoquer une méthode sur l'objet distant : // Donner le nom du service demandé static final String HELLO_SERVICE_NAME = "HelloService"; // Obtenir une référence vers le remiregistry distant Registry registry = LocateRegistry.getRegistry(host, port); // Obtenir une référence vers l objet distant (via le stub local) Hello hello = (Hello)registry.lookup(HELLO_SERVICE_NAME); // Invoquer des méthodes de l'objet distant message = hello.readmessage(); // Imprimer le message à la console System.out.println("Message from remote HelloService: " + this.message); 34

Exécution basique de l exemple (avec partage de code via NFS) En étant toujours dans le même répertoire : - Lancer rmiregistry en arrière plan ; - Lancer le serveur sur la même machine (<lamachine>) que celle où tourne rmiregistry ; - Lancer le client sur une machine quelconque, mais en étant dans le même répertoire pour retrouver les stubs : java HelloClient <lamachine> Le partage du bytecode (pour les stubs) est assuré par NFS : - Le client et le serveur, même s'ils ne sont pas sur la même machine, partagent le même système de fichiers. Dans le cas général, il faut faire transiter les stubs par un serveur publique - ex : http, ftp,. 35

Synthèse Côté serveur Ecrire : Les interfaces "prototypant" les méthodes distantes (extends java.rmi.remote) Lancer : Côté Client Ecrire : Lancer : Les classes qui les implémentent Une méthode (ex : main) pour créer des instances et les enregistrer avec rmiregistry rmic (optionnel) : création du stub et du squelette à partir des fichiers.class des implémentations rendre accessibles par un serveur Web ou Ftp les objets à télécharger (ex : bytecode de stubs) rmiregistry : l'enregistrement des objets distants sera fait lors de l'appel à bind Lancer l application java du serveur, avec des paramètres de sécurité,..etc. L'appel à lookup() sur le rmiregistry pour obtenir le stub de l objet distant Les appels à l objets distants via le stub Comme un programme java local, avec des paramètres de sécurité en plus 36

Déploiement de l application Pour lancer un serveur : java -Djava.rmi.server.codebase=http://perso.enst.fr/~$USER/tp/ -Djava.security.policy=java.policy HelloServer <port> <message> -server.codebase donne le nom du serveur web d'où les stubs seront téléchargés, -java.policy donne les droits d'accès qui seront vérifiés par le Security Manager - voici le contenu de ce fichier (donner tous les droits, non-recommandé) : grant{ }; permission java.security.allpermission; 37

Java RMI - 2 ème exemple Agent distribué A. Diaconescu, L. Pautet & B. Dupouy 39

Exemple: agent mobile Un client voulant acheter un produit va créer un agent au lieu d'interroger luimême tous les sites détenteurs de magasins vendant le produit. L'agent donnera au client le nom du site qui propose le meilleur prix. Mise en œuvre : Le client va lancer sa demande depuis un site appelé Initiator. Il initialise un tableau de sites à parcourir, puis Il invoque à distance sur le premier site la méthode migrate(), à laquelle il a passé l'agent en argument. 39

Scénario Un client (Initiateur) va envoyer un Agent interroger successivement plusieurs serveurs (Hôtes) Chaque Hôte prendra successivement le rôle de serveur et de client Le site Initiateur démarre et termine le processus 40

Transfert de bytecode Remarquez les différents objets téléchargés : Le Stub (de Hôte et d Initiateur) qui permet l'exécution distante de la méthode migrate L Agent transmis en paramètre de la méthode migrate NOTE: il ne faut pas confondre l envoi de l instance agent (en paramètre de la méthode migrate) avec le transfert du bytecode de la classe Agent 41

Récapitulatif du fonctionnement La liste des Sites à parcourir se trouve dans l agent Le Site Initiateur appelle le premier Site Hôte (dans la liste) Chaque Site Hôte appelle le prochain Site Hôte (en suivant la liste des Sites de l Agent) Le dernier Site Hôte appelle l Initiateur L agent est transmis en paramètre de chaque appel distant migrate( agent ) La méthode migrate de l Initiateur est particulière - elle demande d'afficher les résultats obtenus 42

Descriptif des transferts de l agent Observez ci-dessous le circuit parcouru par l agent : 43

Schéma des transferts de bytecode - codebase local via NFS - 44

Résumé des transferts de bytecode - codebase sur serveur http - 45

Le serveur Le serveur exécute la fonction migrate pour le client : il récupère alors le code de l'agent. il le fait exécuter par un Thread qui appelle lui-même migrate sur le site suivant : Voici l'interface fournie par le serveur (Host.java) : public interface Host extends Remote { void migrate(agent a) throws RemoteException; } Le code d'agent n'est pas présent lors de l'écriture de ce serveur 46

Le serveur Implémentation de l'interface (HostImplem.java) : La méthode migrate invoquée à distance crée un Thread - elle rend donc la main sans attendre la fin du traitement de l'agent (exécution puis migration). public class HostImplem implements Host{ public HostImplem(String filename) throws RemoteException{ super(); this.mystore = new Store(fileName); } } public void migrate(agent a){ AgentThread mythread = new AgentThread(agent, this.mystore); mythread.start(); } 47

L Agent Agent.java est l'interface pour les agents. L'objet sera implémenté par le "client" (Initiateur). public interface Agent extends Serializable { } // Traitement effectue par l'agent sur chaque hôte ex : getminprice void traitement(); // Affiche le résultat des traitements : effectué par // l'agent lorsqu'il revient sur le site initiateur void displayresult(); // Renvoie le nom de l'hôte suivant a visiter par l'agent String getnexthostname (); Serializable indique que les paramètres utilisés seront sérialisés et normalisés lors de l'appel distant («marshalling»). 48

Le Thread qui gère l agent ThreadAgent est le support système offert par un Hôte pour traiter un agent : cette classe définit le thread qui va être lancé chaque fois qu'un agent arrive sur un site. class ThreadAgent extends Thread { } public void run() { // On effectue ici le traitement demandé par l'agent... // On fait ensuite migrer l'agent vers l'hote suivant String nexthostname = this.theagent.getnexthostname();... Host nexthost = (Host) registry.lookup(nextservicename); nexthost.migrate(this.theagent); } 49

L Initiateur Implémentation de l Initiateur, c'est à dire du site "client" qui crée et lance l agent vers les différents serveurs. La méthode migrate est ici particulière : elle ne déclenche pas l'exécution de l'agent mais lui demande d'afficher les résultats obtenus. public class Initiator implements Host { public void migrate(agent a) { a.displayresult(); } } public static void main(string args[]) { AgentImplem agent = new AgentImplem(rmi-port, product, hosts);... firstremotehost.migrate(agent); } 50

Initiateur Voici la commande pour lancer l'initiateur : java -Djava.rmi.server.codebase=http://perso.enst.fr/~$USER/tp-rmi/... -Djava.security.policy=java.policy Initiator <rmirgistry port> <product> <host> <host>... server.codebase donne le nom du serveur web d'où l'agent sera téléchargé, le fichier java.policy donne les droits d'accès qui seront vérifiés par le Security Manager 51