Services de Gestion du Cycle de Vie
Transcription
Services de Gestion du Cycle de Vie
Introduction But : optimisation et contrôle des ressources occupées par un Session Bean Services de Gestion du Cycle de Vie Instanciation de moins de Bean qu’il y a de client !!Optimisation de la mémoire et des ressources !!Optimisation en vitesse des méthodes de création !!Résistance aux attaques de déni de service Gaël Thomas [email protected] Notion de pool de Bean !!Ensemble d’instances de Beans en mémoire !!Instances réutilisées pour servir plusieurs clients !!Moins de Bean en mémoire que de clients requis à un instant donné Université Pierre et Marie Curie Master Informatique M2 – Spécialité SAR 2008-2009 Introduction Objet d’interposition EJB (anciennement EJBObject) !!Proxy pour le bean dans le conteneur !!Intercepte les requêtes entrantes et sortantes Serveur WEB Service de transport : IIOP, RMI ou autre Cache 2008-2009 Conteneur EJB Master SAR - M2 MDOC - Introduction Principe : toute requête est interceptée avant d’arriver au Bean Service BD : JDBC Conteneur WEB Service Transaction: JTA/JTX Service Nommage : JNDI JEE Conteneur EJB 2 Mise en œuvre Client léger : navigateur Web HTTP Client lourd Master SAR - M2 MDOC - Introduction But poursuivi : !!Partage de bean de session sans état !!Mise dans zone de swap de bean de session avec état Base De Donnée 3 2008-2009 Master SAR - M2 MDOC - Introduction 4 Mise en œuvre Mise en œuvre Objet d’interposition : graphe d’héritage/implantation Objet d’interposition : recherche et allocation Service de résolution de noms Interface du Bean implante 1. Recherche du bean implante implante Squelette de l’objet d’interp. Classe du Proxy Service de Gestion du cycle de vie 3. Allocation hérite Classe de L’objet d’interp. Proxy (client) Classe du Bean 2. Délégation par référence 3. Allocation/utilisation Objet d’interposition implante Généré à la demande Chez le client 2008-2009 Générés au Chargement du Bean Par le conteneur Master SAR - M2 MDOC - Introduction 5 2008-2009 Mise en œuvre 6 Toute stratégie admissible! Service de Gestion du cycle de vie 3. Recherche de Bean Proxy Objet (client) 2. Délég d’interposition 5. Délég !!Une instance de Bean par client si Statefull !!Jamais deux invocations en // (pour tout Session Bean) 4. Allocation/ Association Dans la suite : proposition d’implantation (largement retenue) Instance du Bean !!Utilisation de pool de threads, de pools de Beans !!Gestion d’un cache implante implante 2008-2009 Master SAR - M2 MDOC - Introduction Implantation d’un service de Gestion de vie !!Délégation (étape 2) : gestion de la répartition !!Délégation (étape 5) : gestion du cycle de vie Client Conteneur Mise en œuvre Objet d’interposition : invocation 1. Invocation Interface du Bean Client Interface du Bean Master SAR - M2 MDOC - Introduction Conteneur 7 2008-2009 Master SAR - M2 MDOC - Introduction 8 Gestion de la Concurrence Cycle de vie des Beans sans état Rappel : gestion de la concurrence dans les intergiciels Session Bean sans état : un ensemble (pool) de Bean Partagés !!1 thread par requêtes !!Pool de thread dynamique (borne maximale) par Bean !!Un Bean par requête en cours : simplifie la gestion de la concurrence !!Un unique intercepteur ou n intercepteurs (choisit une instance + 1 thread pour une requête) Thread 1 Thread 2 Bean 1 Bean 2 Intercepteur bean 1 Intercepteur bean 2 !!Ajustement de la taille du pool en fonction du nombre de requêtes en // Thread 3 Exemple : pool de deux Beans avec trois clients Thread oisif Proxy client 1 connexion Mémoire centrale Serveur Bean 1 pour client 2 (thread 1) Thread de réception Proxy client 2 Intercepteur Bean 2 pour client 3 (thread 2) req en cours Clients Proxy bean 1 2008-2009 Proxy client 3 Proxy bean 2 Master SAR - M2 MDOC - Introduction 9 2008-2009 Cycle de vie des Beans sans état Master SAR - M2 MDOC - Introduction Exemple : trois clients, deux beans en mémoire, un bean swappé Initié par conteneur (augmentation taille pool) Proxy bean 1 Initié par bean (fin invocation de méthode) Méthode métier Method Run Proxy bean 2 Initié par client (invocation de méthode) Mémoire centrale Conteneur Intercepteur 1 Bean 1 Intercepteur 2 Bean 2 Master SAR - M2 MDOC - Introduction Zone de swap Intercepteur 3 Proxy bean 3 2008-2009 10 !!1 Bean unique par client !!Gestion d’un fichier d’échange (swap) !!Limite le nombre de Bean présent en mémoire à chaque instant !!Meilleurs passage à l’échelle en nombre de clients ejb.destroy() Class.newInstance() Fin méthode métier Bean 4 oisif Session Bean avec état Does Not Exist Method Ready Bean 3 oisif Cycle de vie des Beans avec état Cycle de vie d’un Session Bean sans état Initié par conteneur (diminution taille pool ou déchargement unité déploiement ) Conteneur 11 2008-2009 Bean 3 Master SAR - M2 MDOC - Introduction 12 Cycle de vie des Beans avec état Cycle de vie des Entity Beans Cycle de vie d’un Session Bean avec état Cycle de vie d’un Entity Bean Invocation client Timeout conteneur expiré Throws system exception Does Not Exist ejb.destroy(), timeout Fin méthode métier Code métier du Bean 2008-2009 Class.newInstance() Method Ready Recharge la dernière version de la base Recherche de bean Par client passivation Méthode métier, ejb.destroy(), timeout Méthode métier Inséré dans la base de données em.persist() Conteneur manque De mémoire em.refresh() Attached Passive em.merge() Synchronisation entre copie et base de données Timeout conteneur expiré Method Run Created Bean copié Detached Bean sérialisé vers un autre client Invocation client Master SAR - M2 MDOC - Introduction 13 2008-2009 Chargement de classe dans JEE Master SAR - M2 MDOC - Introduction 14 Chargement de classe dans JEE Chargement de classe et mise à jour des EJB Pourquoi définir de nouveaux chargeurs de classes Un chargeur de classe charge de nouvelles classes dynamiquement dans la machine virtuelle Pour décharger et mettre à jour des classes à l’exécution !! OSGi™, JEE, Web Component, CCM, Corba, RMI… Pour chercher des classes absentes du CLASSPATH Évite de charger toutes les classes au démarrage !! URLClassLoader, AppletClassLoader… !! Optimise le nombre de classes chargées Exemple : les classes d’exceptions ne sont chargées que si elles sont utilisées !! Permet de choisir dynamiquement les classes chargées en fonction du contexte Exemple : la classe d’encodage des caractères chargées dépend de l’alphabet utilisé sur la machine locale !! Permet de construire des serveurs d’applications Pour modifier le bytecode des classes au chargement !! Décryptage, décompactage (jar files…) !! Insertion d’aspects (JAC, JBoss AOP, EasyBeans…) !! Manipulation direct de bytecode (Javassist, Bcel, asm…) Pour vérifier le bytecode !! Signature, vérification de type, sécurité… 2008-2009 Principe des Systèmes Informatiques Avancé 15 2008-2009 Principe des Systèmes Informatiques Avancé 16 Chargement de classe dans JEE Chargement de classe dans JEE Un chargeur de classe charge une classe à partir de son nom de façon unique !! Gère le chargement d’un ensemble de classes !! Gère les packages associés !! Gère l’accès aux ressources (images etc…) associés aux classes !! ClassLoader.loadClass(String name, boolean resolve) !! Class.forName(String name, boolean initialise, ClassLoader parent) Remarques Un chargeur de classe est une instance d’une classe qui hérite de la classe java.lang.ClassLoader !! Une classe possède un chargeur de classes et ne peut pas en changer !! Une classe est identifiée de manière unique par son nom et son chargeur !! Une même classe peut être chargée dans plusieurs chargeurs de classes Un chargeur de classe possède un chargeur parent sauf le chargeur initial (qui charge rt.jar/core.jar) Fonctionnement par défaut : !! loadClass : cherche d’abord dans le chargeur parent Évite de charger plusieurs fois java.lang.Object !! findClass : cherche dans le CLASSPATH uniquement (loader applicatif) Deux méthodes principales : !! loadClass(String) : cherche une classe parmi les classes déjà chargées !! findClass(String) : construit une nouvelle classe en mémoire 2008-2009 Principe des Systèmes Informatiques Avancé Tout chargement est effectué dans le même chargeur de la classe qui initie le chargement, sauf avec les méthodes 17 2008-2009 Chargement de classe dans JEE Principe des Systèmes Informatiques Avancé Chargement de classe dans JEE Délégation par héritage : délégation vers le parent réussi Délégation par héritage : délégation vers le parent ratée findClass(java.io.File.getName()) findClass(maClass.getName()) Chargeur initial loadClass(java.io.File.getName()) Chargeur initial <java.io.File, initial> loadClass(maClass.getName()) Mon chargeur loadClass(java.io.File.getName()) 2008-2009 null findClass(maClass.getName()) Mon chargeur <java.io.File, initial> Principe des Systèmes Informatiques Avancé 18 loadClass(maClass.getName()) 19 2008-2009 <maClass, Mon chargeur> Principe des Systèmes Informatiques Avancé 20 Chargement de classe dans JEE Chargement de classe dans JEE Arbre de délégation au démarrage Délégation par héritage : chargement multiple findClass ClassLoader Bootstrap ou initial (natif et intégré à la VM) !! Charge les classes de démarrage (rt.jar/core.jar/glibj.jar) !! Pas de vérification de bytecode au chargement (rt.jar distribué avec la JVM) Chargeur initial loadClass findClass null loadClass !! Sa référence est null null sun.misc.Launcher$ExtClassLoader (extension) (écrit en Java) findClass !! Charge les classes des jarfiles présents dans le répertoire des extensions standards C1 loadClass("X") C2 <X, C1> loadClass("X") !! Pas de vérification de bytecode au chargement !! Son parent est le ClassLoader initial sun.misc.Launcher$AppClassLoader (application ou système) (écrit en Java) <X, C2> !! Charge les classes et les jarfiles du CLASSPATH !! Vérification du bytecode au chargement <X, C1> et <X, C2> sont deux classes différentes !! Sa référence est donnée par ClassLoader.getSystemClassLoader() Peuvent avoir des bytecodes identiques, mais pas nécessairement! 2008-2009 Principe des Systèmes Informatiques Avancé !! Son parent est le ExtClassLoader 21 2008-2009 Chargement de classe dans JEE Principe des Systèmes Informatiques Avancé 22 Chargement de classe dans JEE Un objet n’est libéré que si il n’est plus référencé ! Une classe n’est libérée que si elle n’est plus référencée Mise en œuvre difficile Un chargeur de classe possède une table de hash de toutes les classes qu’il a chargé ! Une classe n’est libérée que si son chargeur est libéré Une classe peut être libérée pourvu que son chargeur ne soit plus référencé •! Un objet référence sa classe •! La classe référence son chargeur de classe •! Le chargeur de classe référence toute les classes qu’il a chargé Pour libérer une classe il faut s’assurer qu’il n’existe plus aucune référence vers une des instances d’une des classes gérées par le chargeur de classe Solution proposée par les serveurs d’application JEE Impossibilité de partager du code et/ou des objets " ! Une classe peut être mise à jour dynamiquement 2008-2009 Principe des Systèmes Informatiques Avancé 23 2008-2009 Principe des Systèmes Informatiques Avancé 24 Chargement de classe dans JEE Chargement de classe dans JEE Le chargeur de classe (1/2) Le chargeur de classe (2/2) public class Test extends ClassLoader { private String name; public Class findClass(String name) throws … { try { File file = new File("titi", name + ".class"); InputStream is = new FileInputStream(file); int length = (int)file.length(); byte b[] = new byte[length]; is.read(b); // We can modify or verify the bytecode from b return defineClass(name, b, 0, length); } catch(Exception e) { throw new ClassNotFoundException(name); } } public Test(String name) { this.name = name; } public void finalize() { System.out.println("Destroy all classes"); } public String toString() { return "ClassLoader<" + name + ">"; } public static void main(String args[]) throws Exception { (new Test("one")). loadClass("Titi").getDeclaredMethod("f").invoke(null); (new Test("two")). loadClass("Titi").getDeclaredMethod("f").invoke(null); System.gc(); } 2008-2009 Principe des Systèmes Informatiques Avancé 25 2008-2009 Chargement de classe dans JEE Principe des Systèmes Informatiques Avancé 26 Chargement de classe dans JEE La classe chargée par notre nouveau chargeur La classe chargée explicitement dans notre chargeur public class Titi { public static int a = 0; class Toto { public Toto() { System.out.println("-- ClassLoader tree --"); // champs static : 1 par loader public static void f() { System.out.println("In f, a is " + a++); new Toto(); // chargement d’une sous-classe } } for(ClassLoader cur=getClass().getClassLoader(); cur!=null; cur=cur.getParent()) System.out.println(" " + cur); System.out.println(" primordial"); } } 2008-2009 Principe des Systèmes Informatiques Avancé 27 2008-2009 Principe des Systèmes Informatiques Avancé 28 Chargement de classe dans JEE Chargement de classe dans JEE Chargement de classe et visibilité dans JEE Chargement de classe dans les serveurs d’application EJB Pas spécifié, dépend du vendeur! Services systèmes : visibilités des classes mutualisé En général : un chargeur de classe par unité de déploiement (pour approfondir, voir cours OSGi) Composants applicatifs : visibilité hiérarchique Service de Transaction !!Un composant accède à tous les autres services systèmes !!Un composant ne peut pas accéder aux autres composants Service EJB 2 Service Déploiement Unité Depl. Des EJB 2008-2009 Master SAR - M2 MDOC - Introduction 29 2008-2009 Chargement de classe dans JEE Service EJB 2 Service Déploiement Service Nommage Service EJB 3 Unité Depl. Comp. Web Principe des Systèmes Informatiques Avancé 30 Chargement de classe dans JEE Problème : échange direct d’objets impossible dans la même VM… Service de Transaction Service Nommage Conclusion : même lors d’un appel local, il faut sérialiser/déserialiser les objets Service EJB 3 Remarque : l’échange direct d’objet devrait être proscrit Unité Depl. Des EJB !!Composant A : donne un objet à composant B !!Composant B : refuse de relâcher la référence vers l’objet B !!L’unité de déploiement du composant A ne peut pas être libérée par la VM !!Fuite de mémoire Unité Depl. Comp. Web Échange direct Film ? Dans composants Web : !!Si pas Film.class dans Unité Web ! NoClassDefFoundError !!Si Film.class dans Unité Web ! <Unité EJB, Film> ! <Unité Web, Film> ! ClassCastException 2008-2009 Master SAR - M2 MDOC - Introduction 31 2008-2009 Master SAR - M2 MDOC - Introduction 32 Chargement de classe dans JEE Chargement de classe dans JEE Solution : l’application (.ear) Service de Transaction Service EJB 2 Comment répartir un .ear par l’exemple : Service Déploiement Application (.ear) Service Nommage Application (.ear) Service EJB 3 Trois composants X, Y, Z !!X : composant EJB, utilise Y !!Y : composant EJB, utilise X !!Z : composant Web, utilise X Librairies partagées Fabriquer trois .ear différents en changeant les rôles 2008-2009 Composants EJB Composants EJB EJB de l’application Composants Web Composants Web Servlets/JSP de l’application Master SAR - M2 MDOC - Introduction 33 Conclusion Gestion avancée du cycle de vie Chaque conteneur fournit sa propre gestion Problème de chargement de classe ! complexifie la répartition 2008-2009 Master SAR - M2 MDOC - Introduction 35 X Y Z Application 1 EJB Bibliothèque Non Application 2 Bibliothèque EJB Non Application 3 Bibliothèque Non Web 2008-2009 Master SAR - M2 MDOC - Introduction 34