La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 8. Notion dadaptateur dobjet. 2 c 2003 - Raphaël Marvie Principe Rendre plusieurs objets (Servant) disponibles dans un serveur Chaque objet est associé

Présentations similaires


Présentation au sujet: "1 8. Notion dadaptateur dobjet. 2 c 2003 - Raphaël Marvie Principe Rendre plusieurs objets (Servant) disponibles dans un serveur Chaque objet est associé"— Transcription de la présentation:

1 1 8. Notion dadaptateur dobjet

2 2 c Raphaël Marvie Principe Rendre plusieurs objets (Servant) disponibles dans un serveur Chaque objet est associé à une clé unique dans le serveur Une référence inclut désormais la clé de lobjet Adaptateur dobjet Aiguillage et lien entre le réseau et les objets Gère les clés associées aux objets et leurs références Raffinement du Manager Adaptateur : lien référence / objet dimplémentation Squelette : décodeur de requête pour un objet

3 3 c Raphaël Marvie Architecture version 8 Proxy Réseau ObjectAdaptateur Servant Client Contrat Servant Squelette

4 4 c Raphaël Marvie Interactions version 8

5 5 c Raphaël Marvie Côté serveur Adaptateur dobjet Gestion du accept et du routage des requêtes Connecte les objets et crée leurs références Squelette de service Défini par rapport au contrat de Servant Décodeur de messages réseau pour un Servant particulier Définition de deux squelettes Programme serveur Crée un adaptateur dobjet Crée deux squelettes et servants, les enregistre Active ladaptateur dobjet

6 6 c Raphaël Marvie Contrats interface ServiceA { public String hello (String msg) throws Exception ; public String lower (String msg) throws Exception ; public String upper (String msg) throws Exception ; } interface ServiceB { public boolean isprime (int a) throws Exception ; public int sqr (int a) throws Exception ; }

7 7 c Raphaël Marvie Code Server public class Server { public void run () throws Exception { ObjectAdapter oa = ObjectAdapter.init () ; SkeletonA skel_a = new SkeletonA (new ServantA ()) ; oa.register (skel_a) ; System.out.println (oa.obj2ref (skel_a)) ; SkeletonB skel_b = new SkeletonB (new ServantB ()) ; oa.register (skel_b) ; System.out.println (oa.obj2ref (skel_b)) ; oa.start () ; } // rest is unchanged

8 8 c Raphaël Marvie Code ObjectAdapter (i) public class ObjectAdapter extends Thread { private static ObjectAdapter ref ; private ServerSocket asock ; private Vector skeletons ; protected ObjectAdapter () throws Exception { this.skeletons = new Vector () ; this.asock = new ServerSocket (0) ; } public static ObjectAdapter init () throws Exception { if (ObjectAdapter.ref == null) ObjectAdapter.ref = new ObjectAdapter () ; return ObjectAdapter.ref ; }

9 9 c Raphaël Marvie Code ObjectAdapter (ii) public String obj2ref (Skeleton obj) { int key = this.skeletons.indexOf (obj) ; if (key == -1) return null ; String host = null ; try { host = InetAddress.getLocalHost ().getHostAddress () ; } catch (UnknownHostException uhe) { return null ; } int port = this.asock.getLocalPort () ; return host + ":" + port + ":" + key ; }

10 10 c Raphaël Marvie Code ObjectAdapter (iii) public void run () { try { while (true) { Socket sock = this.asock.accept () ; BufferedReader in =... String msg = in.readLine () ; if (msg == null) { // no more to be read sock.close () ; continue ; } int key = Integer.parseInt (msg.substring (0,1)) ;

11 11 c Raphaël Marvie Code ObjectAdapter (iv) try { Skeleton skel = (Skeleton)this.skeletons.elementAt (key) ; skel.init (sock) ; new Thread (skel).start () ; } catch (ArrayIndexOutOfBoundsException e) { sock.close () ; } } catch (Exception e) { return ; }

12 12 c Raphaël Marvie Interface Skeleton interface Skeleton extends Runnable { void init (Socket sock) throws Exception ; }

13 13 c Raphaël Marvie Code SkeletonA (i) public class SkeletonA implements Skeleton { private ServantA ref ; public SkeletonA (ServantA s) throws Exception { this.ref = s ; } public void init (Socket sock) throws Exception { this.in =... this.out =... }

14 14 c Raphaël Marvie Code SkeletonA (ii) public void run () { try { while (true) { String msg = this.in.readLine () ; if (msg == null) // no more to be read break ; String res ; switch (msg.charAt (0)) { case 0: res = this.ref.hello (msg.substring (1)) + "\n" ; break ; // etc. }

15 15 c Raphaël Marvie Côté client Modification du proxy Prise en compte des clés dobjets Connexion en deux temps au squelette Définition dun Proxy pour chacun des services Deux chaînes Proxy / Skeleton / Servant Fourniture de la référence comme une propriété Définition de deux programmes clients Chacun utilise un proxy pour un service particulier

16 16 c Raphaël Marvie Code ProxyA (changes) public class ProxyA implements ServiceA { private Socket sock ; private BufferedReader in ; private DataOutputStream out ; public ProxyA (String host, int port, String key) throws Exception { this.sock = new Socket (host, port) ; this.in =... this.out =... this.out.writeBytes (key + "\n") ; }

17 17 c Raphaël Marvie Code ClientA (changes i) public class ClientA { private ServiceA ref ; public ClientA () throws Exception { this.ref = (ServiceA) this.ref2proxy () ; } public void run (String msg) throws Exception { System.out.println (this.ref.hello (msg)) ; System.out.println (this.ref.lower (msg)) ; System.out.println (this.ref.upper (msg)) ; }

18 18 c Raphaël Marvie Code ClientA (changes ii) public ProxyA ref2proxy () throws Exception { Properties props = System.getProperties () ; String ref = props.getProperty ("service.reference") ; if (ref == null) throw new Exception ("no server reference given") ; String parts[] = ref.split (":") ; if (parts.length < 3) throw new Exception ("malformed reference") ; String host = parts [0] ; int port = Integer.parseInt (parts [1]) ; String key = parts [2] ; return new ProxyA (host, port, key) ; }

19 19 c Raphaël Marvie Bénéfices et limitations Bénéfices Serveur multi-services et multi-threadé (Skeleton) Identification complète dun service – adresse:port:clé Les références sont créées au niveau du serveur Limitations Comment définir et utiliser des exceptions applicatives ? Comment simplifier la traduction de référence en Proxy ?

20 20 9. Exceptions et traduction référence vers Proxy

21 21 c Raphaël Marvie Principe Exceptions Ajout dun code dans les messages de retour 0 : OK; sinon un numéro dexception... Traduction automatique de références en Proxy Extension des références pour contenir le type des références Contrôle du typage lors de la création du proxy Instanciation et initialisation automatique du Proxy

22 22 c Raphaël Marvie Architecture version 9 Proxy Réseau ObjectAdaptateur Servant Client Contrat Servant Squelette

23 23 c Raphaël Marvie Interactions version 9

24 24 c Raphaël Marvie Chargement automatique de proxy Motivations Transformation dune référence de service distant en proxy Contrôler la conformité entre le type du proxy et du service Modifications des implémentations Extension des références Ajout du type du service dans la référence : adresse:port:clé:type Règles de nommage des classes NomDuServiceProxy, NomDuServiceSkeleton, NomDuServiceServant Les squelettes fournissent le type du service (pour construire la référence) Interface de base Proxy implémentée par tous les proxy (pour init )

25 25 c Raphaël Marvie Opération ref2proxy (i) public class Util { public static Proxy ref2proxy (String ref) throws Exception { String parts[] = ref.split (":") ; if (parts.length < 4) throw new Exception ("malformed reference") ; String host = parts [0] ; int port = Integer.parseInt (parts [1]) ; String key = parts [2] ; String type = parts [3] ;

26 26 c Raphaël Marvie Opération ref2proxy (ii) // instanciation du bon proxy (présent dans classpath : convention de nommage) Class pclass = Class.forName (type + "Proxy") ; Proxy p = (Proxy) pclass.newInstance () ; // initialisation p.init (host, port, key) ; return p ; }

27 27 c Raphaël Marvie Interface Proxy interface Proxy { public void init (String host, int port, String key) throws Exception ; }

28 28 c Raphaël Marvie Côté serveur Gestion des exceptions Définition des exceptions dans le contrat du service Modification des squelettes pour transférer les exceptions Ajout de try catch pour les exceptions applicatives Ajout dun code en début de message réponse réseau Typage des références Modification des squelettes : fourniture du type du servant Modification de lopération obj2ref dans ladaptateur dobjet

29 29 c Raphaël Marvie Contrat ServiceB public class DivByZero extends Exception {} interface ServiceB { public boolean isprime (int a) throws Exception; public int sqr (int a) throws Exception ; public int div (int a, int b) throws Exception, DivByZero; }

30 30 c Raphaël Marvie Interface Skeleton interface Skeleton extends Runnable { void init (Socket sock) throws Exception ; String type () ; }

31 31 c Raphaël Marvie Code ServiceBSkeleton (modifs) public String type () { return "step9.ServiceB" ; } public void run () { … // managing isprime method from ServiceB case 0: int val0 = Integer.parseInt (msg.substring (1)) ; res = "0" + this.ref.isprime (val0) + "\n" ; break ;

32 32 c Raphaël Marvie Code ServiceBSkeleton (changes ii) // managing div method from ServiceB case 2: String args [] = msg.substring (1).split (" ") ; int arg0 = Integer.parseInt (args [0]) ; int arg1 = Integer.parseInt (args [1]) ; try { res = "0" + this.ref.div (arg0,arg1) + "\n" ; } catch (DivByZero e) { res = "1\n" ; // first exception raised } break ; // etc. }

33 33 c Raphaël Marvie Code ObjectAdapter public String obj2ref (Skeleton obj) { int key = this.skeletons.indexOf (obj) ; if (key == -1) return null ; String host = null ; try { host = InetAddress.getLocalHost ().getHostAddress () ; } catch (UnknownHostException uhe) { return null ; } int port = this.asock.getLocalPort () ; return host + ":" + port + ":" + key + ":" + obj.type () ; }

34 34 c Raphaël Marvie Côté client Modification des proxy Gestion des exceptions Si code interne supérieur à 0 alors lever lexception équivalente Modification des clients Utilisation de lopération ref2proxy Plus besoin de préciser le nom du Proxy Utiliser le proxy avec le type de son interface

35 35 c Raphaël Marvie Code ServiceBProxy (changes i) public boolean isprime (int val) throws Exception { // automatic conversion of int to string out.writeBytes ("0" + val + "\n") ; String res = in.readLine () ; return Boolean.valueOf( res.substring (1)).booleanValue () ; }

36 36 c Raphaël Marvie Code ServiceBProxy (changes ii) public int div (int a, int b) throws Exception, DivByZero { out.writeBytes ("2" + a + " " + b + "\n") ; String res = in.readLine () ; if (res.charAt (0) == 1) throw new DivByZero () ; return Integer.parseInt (res.substring (1)) ; }

37 37 c Raphaël Marvie Code ClientB (changes) public ClientB () throws Exception { Properties props = System.getProperties() ; String ref = props.getProperty("service.reference") ; this.refB = (ServiceB) Util.ref2proxy (ref) ; } Exécution avec -D"service.reference=localhost:12345:1:step9.ServiceB"

38 38 c Raphaël Marvie Bénéfices et limitations Bénéfices Bénéfices des exceptions sur le code produit Contrôle du typage à lutilisation des références Limitations Partage des références compliqué et réduit au fichier Utiliser facilement plusieurs services dans un même client ?

39 Service de désignation

40 40 c Raphaël Marvie Principe Désignation des objets par des noms symboliques Association : nom symbolique / références Les serveurs enregistrent une référence avec un nom Les clients recherchent une référence avec un nom Service notoire : lannuaire

41 41 c Raphaël Marvie Architecture version 10 Proxy Réseau OAdap… Nommage Servant Client Contrat Service Servant Squelette OAdap…

42 42 c Raphaël Marvie Interactions version 10

43 43 c Raphaël Marvie Annuaire Service au même titre quun autre Défini par une interface Hébergé par un serveur Accessible au travers dun Proxy Particularités Serveur dédié initialisé sur un port prédéfini Connaître la machine = point dentrée du système Proxy particulier pour simplifier lutilisation Patron de conception Singleton

44 44 c Raphaël Marvie Contrat NameService interface NameService { public void export (String name, String ref) throws Exception ; public String lookup (String name) throws Exception ; }

45 45 c Raphaël Marvie Proxy Naming (extrait) public class Naming implements NameService { private static Naming ref ; private Naming () throws Exception { Properties props = System.getProperties () ; String host = props.getProperty ("naming.host") ; // etc. } public static Naming init () throws Exception { if (Naming.ref == null) Naming.ref = new Naming () ; return Naming.ref ; // etc. } // etc. }

46 46 c Raphaël Marvie Côté serveur Diffusion des références Plus daffichage sur la ligne de commande Export des références de services Vers une application répartie Le serveur est client du service de nommage Utilisation du proxy de ce dernier Unique point dentrée : référence du service de nommage $ javac -Dnaming.host=localhost step9.Server

47 47 c Raphaël Marvie Code Server (changes) public void run () throws Exception { Naming ns = Naming.init () ; ObjectAdapter oa = ObjectAdapter.init () ; ServiceASkeleton skel_a = new ServiceASkeleton (new ServiceAServant ()) ; oa.register (skel_a) ; ns.export ("ServiceA", oa.obj2ref (skel_a)) ; ServiceBSkeleton skel_b = new ServiceBSkeleton (new ServiceBServant ()) ; oa.register (skel_b) ; ns.export ("ServiceB", oa.obj2ref (skel_b)) ; oa.run () ; }

48 48 c Raphaël Marvie Côté client Récupération des références Plus de lecture de fichiers texte Lookup des références de service Vers une application répartie Client est client des services A, B et Nommage Utilisation des proxy de ces trois services Unique point dentrée : référence du service de nommage $ javac -Dnaming.host=localhost step9.Client

49 49 c Raphaël Marvie Code Client (changes) public class Client { public Client () throws Exception { Naming ns = Naming.init () ; String ref_a = ns.lookup ("ServiceA") ; this.refA = (ServiceA) Util.ref2proxy (ref_a) ; String ref_b = ns.lookup ("ServiceB") ; this.refB = (ServiceB) Util.ref2proxy (ref_b) ; } // merge of previous clients code }

50 50 c Raphaël Marvie Bénéfices et limitations Bénéfices Unique point dentrée dans le système Partage simplifié des références de services Limitations On écrit un peu toujours la même chose... On risque à chaque fois de faire des erreurs (skel/proxy)

51 Génération automatique du code technique

52 52 c Raphaël Marvie Principe Ne pas écrire ce qui peut être généré On ne va pas toujours écrire la même chose Un proxy et un squelette suivent toujours le même schéma Quelques mises en oeuvre possibles Générateur réflexif (par rapport aux interfaces Java) Réalisation uniforme (mono-langage) Implémentation assez technique Génération par rapport à des contrats XML implémentation relativement directe (DOM) Permet de gérer plusieurs langages cibles

53 53 c Raphaël Marvie Règles de génération Un contrat de service XXX devient 3 classes XXXProxy Une méthode init pour la connexion Une méthode par méthode du contrat XXXSkeleton Une méthode run avec un switch Une entrée par méthode du contrat XXXServant Les méthodes du contrat à compléter

54 54 c Raphaël Marvie Bénéfices et limitations Bénéfices : Contrat + générateur Rapidité de développement Proxy, Skeleton, Servant Il ne reste plus quà écrire le code fonctionnel Moins derreurs (correspondances, …) Limitations Ce nest toujours pas parfait : implémentation basique Passage de références dobjets distants ? Passage dobjets sérialisés ?

55 55 Début de conclusions

56 56 c Raphaël Marvie Constat Progressivement nous venons de définir un bus logiciel Sa structuration Son utilisation Un bus logiciel repose essentiellement sur deux concepts La désignation dun service (les références) La liaison avec un service distant (établir une connexion)

57 57 c Raphaël Marvie Architecture générale dun bus logiciel

58 58 c Raphaël Marvie Premières Conclusions Bénéfices Abstraction de la préoccupation communication dune application Génération du code technique de la préoccupation automatisable Et maintenant ? Raffiner le code pour loptimiser et le rendre plus fiable meilleure structuration des messages réseau (définition dun protocole) dépasser la limitation de 10 méthodes par interface permettre le passage de types complexes et références en paramètres Développement de services de base (comme lannuaire)

59 59 c Raphaël Marvie Et après … Création des objets accessibles à distance Pool dobjets Assemblage dynamique Adaptabilité Persistance des informations …

60 60 c Raphaël Marvie Classes dintergiciels Objets répartis Java RMI, CORBA, DCOM,.NET Composants répartis Java Beans, Enterprise Java Beans, CCM Message-Oriented Middleware (MOM) Message Queues, Publish-Subscribe Intégration dapplications Web Services Coordination Accès aux données, persistance Support dapplications mobiles

61 61 c Raphaël Marvie Propriétés à prendre en compte Hétérogénéité Hardware Langages Ressources Contexte dusage Désignation/localisation Migration Mobilité Ubiquité Mireille Blay-Fornarino Distribution Equilibrage de charge Parallelisation Decentralisation Prise de décision Contrôle de laccès concurrent Clients simultanés Serveurs parallèles Données réparties synchronisation de l'accès aux ressources, Gestion des transactions

62 62 c Raphaël Marvie Propriétés à prendre en compte Sécurité authentification (certificats) sécurisation des communications (cryptage) contrôle daccès (autorisation) Dimensionnement croissance du nombre de clients « duplication des serveurs », « gestion de caches » gigantesque quantité de données Tolérance aux fautes site en panne ou inaccessible « redondance des serveurs » « fonctionnement en mode dégradé » Mireille Blay-Fornarino

63 63 c Raphaël Marvie Bibliographie École dété sur les Intergiciels et sur la Construction dApplications Réparties : Patrons et Canevas pour lIntergiciel Sacha Krakowiak, ICAR 2003 Dis papa, cest quoi un bus logiciel réparti ? LIFL – IRCICA Equipe GOAL Décembre 2003


Télécharger ppt "1 8. Notion dadaptateur dobjet. 2 c 2003 - Raphaël Marvie Principe Rendre plusieurs objets (Servant) disponibles dans un serveur Chaque objet est associé"

Présentations similaires


Annonces Google